Python 2 to 3 Conversion

Ben Finney ben+python at benfinney.id.au
Sat Feb 17 02:11:00 EST 2018


Wildman via Python-list <python-list at python.org> writes:

> def get_ip_address(ifname):
>     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>     return socket.inet_ntoa(fcntl.ioctl(
>         s.fileno(),
>         0x8915,  # SIOCGIFADDR
>         struct.pack('256s', ifname[:15])
>         )[20:24])
> print(get_ip_address("eth0"))
> print(get_ip_address("lo"))

In Python 3, the literal ‘"eth0"’ creates a text (‘unicode’) object.

Python 3 correctly implements text as Unicode, which has no particular
representation as bytes.

You then pass that object to ‘struct.pack('256s', …)’, which (as the
error says) expects a ‘bytes’ object. A text object is incompatible with
that expectation.

If you want a sequence of bytes, perhaps you want to encode the text, to
some specified encoding. Maybe ASCII:

    struct.pack('256s', ifname.encode('ascii'))

That may be different from what you want the code to do, though. It's
not clear from the code what its intention is.

-- 
 \     “What is needed is not the will to believe but the will to find |
  `\       out, which is the exact opposite.” —Bertrand Russell, _Free |
_o__)                           Thought and Official Propaganda_, 1928 |
Ben Finney




More information about the Python-list mailing list