struct.error:'s'的参数必须是python 3.4中的bytes对象

时间:2014-12-10 00:01:44

标签: python networking

Code I尝试在python 3.4中使用:

#!/usr/bin/python3
 def get_mac_addr(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s', ifname[:15]))
    return ''.join(['%02x:' % ord(char) for char in info[18:24]])[:-1]
 print (get_mac_addr('eth0'))

Error: struct.error: argument for 's' must be a bytes object

我看到这段代码在不使用python3的情况下确实有效,但我的项目需要3。我尝试与问题进行比较:Struct.Error, Must Be a Bytes Object?但我无法看到如何将此问题应用于自己。

1 个答案:

答案 0 :(得分:2)

您需要将ifname字符串转换为字节。您也不需要调用ord(),因为ioctl返回字节,而不是字符串:

...
info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s', bytes(ifname[:15], 'utf-8')))
return ''.join(['%02x:' % b for b in info[18:24]])[:-1]
...

有关python3

中字符串和字节的更多信息,请参阅this SO question