在Unix上的Python脚本中发生错误时,将发送一封电子邮件。
如果IP地址是测试服务器192.168.100.37,我被要求在电子邮件的主题行中添加{Testing Environment}。这样,我们就可以拥有一个脚本版本,并可以判断电子邮件是否来自测试服务器上困惑的数据。
但是,当我在Google上搜索时,我会不断找到以下代码:
import socket
socket.gethostbyname(socket.gethostname())
但是,这给了我127.0.1.1的IP地址。当我使用
ifconfig
时我得到了eth0 Link encap:Ethernet HWaddr 00:1c:c4:2c:c8:3e
inet addr:192.168.100.37 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:75760697 errors:0 dropped:411180 overruns:0 frame:0
TX packets:23166399 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:59525958247 (59.5 GB) TX bytes:10142130096 (10.1 GB)
Interrupt:19 Memory:f0500000-f0520000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:25573544 errors:0 dropped:0 overruns:0 frame:0
TX packets:25573544 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:44531490070 (44.5 GB) TX bytes:44531490070 (44.5 GB)
首先,我不知道它是从哪里获得的127.0.1.1,但是无论哪种方式都不是我想要的。当我使用google时,我一直使用相同的语法,Bash脚本或netifaces,而我正尝试使用标准库。
那么如何在Python中获取eth0的IP地址呢?
最佳答案
两种方法:
方法1(使用外部软件包)
您需要询问绑定(bind)到eth0
接口(interface)的IP地址。可从netifaces package获得
import netifaces as ni
ni.ifaddresses('eth0')
ip = ni.ifaddresses('eth0')[ni.AF_INET][0]['addr']
print ip # should print "192.168.100.37"
您还可以通过以下方式获取所有可用接口(interface)的列表
ni.interfaces()
方法2(无外部包装)
这是一种无需使用python包即可获取IP地址的方法:
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])
get_ip_address('eth0') # '192.168.0.110'
注意:检测IP地址以确定您正在使用的环境是很不容易的事情。几乎所有框架都提供了一种非常简单的方法来设置/修改环境变量以指示当前环境。尝试查看有关此内容的文档。它应该像做一样简单
if app.config['ENV'] == 'production':
#send production email
else:
#send development email
关于python - 如何在Python中从NIC获取IP地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24196932/