Python 3.4中的结构体错误:'s'的参数必须是字节对象

4

我尝试在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时可以工作,但是我需要它在Python3上运行。我尝试将其与问题进行比较: Struct.Error,必须是一个字节对象?,但我不知道如何将其应用于自己的项目。

1个回答

5

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

...
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中的字符串和字节,请参见此SO问题了解更多信息。


谢谢!我认为这个(或其他什么?)可能会导致另一个错误。"TypeError: ord() expected string of length 1, but int found" 我相信ord()应该返回表示输入字符串的Unicode代码点的整数...你能指导我在这段代码中具体要注意什么吗? - Pam B
完美运行!为此苦苦挣扎了几个小时,谢谢!我无法完全理解其背后的逻辑。 - Pam B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接