Python 2 to 3 Conversion
Chris Angelico
rosuav at gmail.com
Sat Feb 17 00:31:19 EST 2018
On Sat, Feb 17, 2018 at 4:15 PM, Wildman via Python-list
<python-list at python.org> wrote:
> I have a bit of code I found on the web that will return
> the ip address of the named network interface. The code
> is for Python 2 and it runs fine. But, I want to use the
> code with Python 3. Below is the code followed by the error
> message. Suggestions appreciated.
>
> #!/usr/bin/env python3
>
> import socket
> import fcntl
> import struct
>
> 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"))
>
>
> Traceback (most recent call last):
> File "./test.py", line 14, in <module>
> print(get_ip_address("eth0"))
> File "./test.py", line 12, in get_ip_address
> struct.pack('256s', ifname[:15])
> struct.error: argument for 's' must be a bytes object
The easiest way is to encode it to ASCII:
struct.pack('256s', ifname[:15].encode('ascii'))
But you may want to see if there's a completely different way to do
what you're looking at. I'm not sure what this is doing, so I can't
advise more specifically.
ChrisA
More information about the Python-list
mailing list