Struct.error: аргумент для 's' должен быть байтовым объектом в python 3.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, но мне он нужен в 3 для моего проекта. Я пытался сравнить с проблемой: Struct.Error, должен быть объект Bytes?, но я не мог понять, как я могу применить это к себе.

Ответ 1

Вам нужно преобразовать строку 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]
...

См. этот вопрос SO для получения дополнительной информации о строках и байтах в python3