首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置时,如何在python中获取本地ip地址

问设置时,如何在python中获取本地ip地址
EN

Stack Overflow用户
提问于 2015-08-18 10:17:11
回答 3查看 2.7K关注 0票数 2

--

我已经搜索了如何使用python获取本地ip地址。(我的python版本是3.4),有一个答案。这个答案说:

代码语言:javascript
复制
import socket
socket.gethostbyname(socket.gethostname())

而且它是有效的。脚本说我的ip地址是192.168.56.1。但是我的本地ip地址是192.168.0.100。

那个ip地址是什么?这是一个ip地址'Virtualbox主机-纯网络‘,这是在我安装virtualbox一周前安装的。(Virtualbox的版本是5.0)我现在有两个网络适配器,一个是'Virtualbox主机-纯网络‘,另一个是局域网

当我在网络面板中关闭'Virtualbox主机专用网络‘时。python脚本说我想要的ip地址是192.168.0.100。

如何获得我的ip地址'192.168.0.100‘而不禁用'Virtualbox主机-纯网络’?(我真的不想关掉“Virtualbox主机-纯网络”。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-18 10:50:42

您可以使用一个名为网面的模块来获取计算机上可用的任何网络接口的ip地址。

如果您在系统上安装了pip,您可以使用安装pip。

代码语言:javascript
复制
pip install netifaces

一个来自linux系统上命令行的示例:

我的机器在eth0上有我的常规网络接口,在eth0:0上有别名网络接口(这类似于您的仅使用virtualbox主机的网络接口,但名称可能不一样)。

通过python解释器获取计算机上可用网络接口的列表:

代码语言:javascript
复制
(stackoverflow)[root@joeyoung.io stackoverflow]# python

>>> import netifaces
>>> netifaces.interfaces()
['lo', 'eth0', 'eth0:0']

获取有关我的常规网络接口eth0的更多信息

代码语言:javascript
复制
>>> netifaces.ifaddresses('eth0')
{17: [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '52:54:00:0d:4d:36'}], 2: [{'broadcast': '159.107.29.255', 'netmask': '255.255.254.0', 'addr': '159.107.28.65'}]}

我只对互联网协议地址家族感兴趣,所以让我们缩小使用AF_INET作为过滤器的结果:

代码语言:javascript
复制
>>> netifaces.ifaddresses('eth0')[netifaces.AF_INET]
[{'broadcast': '159.107.29.255', 'netmask': '255.255.254.0', 'addr': '159.107.28.65'}]

这给了我一个有一个条目的列表。那个条目包含一本字典。为了获得我的addr接口的ip地址,我希望得到由eth0键表示的值:

代码语言:javascript
复制
>>> netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']
'159.107.28.65'

159.107.28.65是我的eth0接口的本地IP地址。

我们还可以按照上面的步骤在eth0:0上获取别名IP地址:

代码语言:javascript
复制
>>> netifaces.ifaddresses('eth0:0')
{2: [{'broadcast': '192.168.13.255', 'netmask': '255.255.255.0', 'addr': '192.168.13.2'}]}
>>> netifaces.ifaddresses('eth0:0')[netifaces.AF_INET]
[{'broadcast': '192.168.13.255', 'netmask': '255.255.255.0', 'addr': '192.168.13.2'}]
>>> netifaces.ifaddresses('eth0:0')[netifaces.AF_INET][0]['addr']
'192.168.13.2'
票数 1
EN

Stack Overflow用户

发布于 2015-08-19 00:28:36

这个序列在Linux虚拟机上适用于我:

代码语言:javascript
复制
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 53))
print s.getsockname()[0]

结果:

代码语言:javascript
复制
10.112.54.236
票数 1
EN

Stack Overflow用户

发布于 2021-11-09 13:30:23

让我把我所做的事记录下来。

我使用Oracle VirtualBox从Windows 10主机运行Linux。

  • 192.168.1.46是Windows10主机的IP地址,即VM主机。
  • 10.0.2.15是VM访问Internet的IP地址。这是由甲骨文VirtualBox自动创建的。NAT用于在Internet和VM主机或VM之间转换TCP/IP消息。
  • 192.168.56.102和192.168.56.1是我手动创建仅主机适配器时甲骨文VirtualBox创建的IP地址。我可以从Windows 10主机登录到Linux。

​

​

我使用psutil (一个Python )和ip (Linux命令)来获取IP地址。

  1. 要获取访问Internet的Windows 10主机的IP地址, 导入psutil作为p;print(p.net_if_addrs()‘Wi’..address) 您可能需要重命名接口名(在我的例子中是“Wi”)。
  2. 要获取访问VM的Windows 10主机的IP地址, python -c“导入psutil作为p;print(p.net_if_addrs()'VirtualBox主机专用网络‘.地址)” 您可能需要重命名接口名(在我的示例中是“VirtualBox主机专用网络”)
  3. 获取Linux的IP地址以访问Internet ip路由得到8.8.8\ awk‘{打印$7}’
  4. 获取Linux的IP地址以访问192.168.56.1 ip路由得到192.168.56.1 \print '{print $5}‘
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32069628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档