我正在使用这个简单的代码:
>>> import socket
>>> socket.gethostbyname(socket.gethostname())
'192.168.160.1'
问题是这给了我错误的IP。做一个简单的ipconfig
,我发现它给了我来自另一个适配器(与VMWARE相关(的信息:
Adaptador de Ethernet VMware Network Adapter VMnet8:
Dirección IPv4. . . . . . . . . . . . . . : 192.168.160.1
Adaptador de LAN inalámbrica Wi-Fi:
Dirección IPv4. . . . . . . . . . . . . . : 192.168.1.51
我通过禁用VMware Network Adapter VMnet8
解决了这个问题。有办法避免这种情况吗?感谢阅读
Python 3.8.6
Vmware 16.0.0.63036
您似乎正在尝试查找用于internet访问的网络接口的IP地址?
假设你真的连接到了互联网,这样的事情会让你明白:
import socket
# create an datagram socket (single UDP request and response, then close)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# connect to an address on the internet, that's likely to always be up
# (the Google primary DNS is a good bet)
sock.connect(("8.8.8.8", 80))
# after connecting, the socket will have the IP in its address
print(sock.getsockname())
# done
sock.close()
结果(在我的电脑上,你的应该与你自己的匹配(:
('192.168.0.132', 56618)
注意:这取决于是否有活动的互联网连接,以及您要连接的服务是否接受连接。这在没有互联网连接的内部网络上不起作用,除非你试图连接到一个可以可靠连接的地址(例如路由器的管理界面(
您可以获取netifaces
包来获取特定网络适配器的IP地址:
import netifaces as ni
ip = ni.ifaddresses('eth0')[ni.AF_INET][0]['addr']
print(ip)
您可以使用任何接口来代替"eth0">
我用Wasif Hasan推荐的netifaces
包找到了一个解决方案,它也可以是通用的。
import netifaces as ni
x = ni.gateways()
y = x['default'][2][1]
ip = ni.ifaddresses(y)[ni.AF_INET][0]['addr']