我尝试在 Mac 上运行以下函数,但它抛出异常
struct.pack('iL', bytes, names.buffer_info()[0])
IOError: [Errno 102] Operation not supported on socket
它在 Linux 上运行得很好。谁能告诉我这是怎么回事?
代码:
def _get_interface_list():
max_iface = 32 # Maximum number of interfaces(Aribtrary)
bytes = max_iface * 32
is_32bit = (8 * struct.calcsize("P")) == 32 # Set Architecture
struct_size = 32 if is_32bit else 40
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
names = array.array('B', '\0' * bytes)
outbytes = struct.unpack('iL', fcntl.ioctl(
s.fileno(),
0x8912, # SIOCGIFCONF
struct.pack('iL', bytes, names.buffer_info()[0])
))[0]
namestr = names.tostring()
return namestr
最佳答案
问题是 Mac OS X 和其他 BSD 系统不支持 SIOCGIFHWADDR
。您必须使用 getifaddrs ,现在 Linux 也支持它,尽管 Python 似乎没有公开它。但是,您可以使用 ctypes 来实现这一点。我希望this example (BSD 样式许可证)可以帮助您。
此外,您可以通过使用 netifaces 来避免所有麻烦。 。
关于Mac OS 上的 Python ioctl 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14094835/