附上 多個方法,最後還是安裝了netifaces…, 當有多個 ip address 時,VirtualBox 的假網卡(vboxnet0)也會吃掉一個 ip, 而且是合法的,通常在 192.168.56.1 ,而且這個 ip 無法被區網路的其他電腦存取。
附註,別直接使用 ‘eth0’,在 Mac OS 裡,沒有 ‘eth0’
You need to ask for the IP address that is bound to your eth0 interface. This is available from the netifaces package
import netifaces as ni
ni.ifaddresses('eth0')
ip = ni.ifaddresses('eth0')[2][0]['addr']
print ip # should print "192.168.100.37"
You can also get a list of all available interfaces via
ni.interfaces()
#!/bin/env python
'''
Different ways to get the ip address of a network device
'''
def get_ip_address_1(ifname='eth0'):
'''
Source:
http://code.activestate.com/recipes/439094/
'''
import socket
import fcntl
import struct
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ipaddr = socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
return ipaddr
def get_ip_address_2():
'''
Source:
http://commandline.org.uk/python/how-to-find-out-ip-address-in-python/
'''
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('google.com', 0))
ipaddr=s.getsockname()[0]
return ipaddr
def get_ip_address_3():
import socket
ipaddr = socket.gethostbyname(socket.gethostname())
return ipaddr
def get_ip_address_4(netdev='eth0'):
# Use ip addr show
import subprocess
arg='ip addr show ' + netdev
p=subprocess.Popen(arg,shell=True,stdout=subprocess.PIPE)
data = p.communicate()
sdata = data[0].split('\n')
macaddr = sdata[1].strip().split(' ')[1]
ipaddr = sdata[2].strip().split(' ')[1].split('/')[0]
return (ipaddr,macaddr)
def get_ip_address_5():
#Use ip route list
import subprocess
arg='ip route list'
p=subprocess.Popen(arg,shell=True,stdout=subprocess.PIPE)
data = p.communicate()
sdata = data[0].split()
ipaddr = sdata[ sdata.index('src')+1 ]
netdev = sdata[ sdata.index('dev')+1 ]
return (ipaddr,netdev)
print(get_ip_address_1())
print(get_ip_address_2())
print(get_ip_address_3())
print(get_ip_address_4())
print(get_ip_address_5())