Python获取Ubuntu机器的局域网IP地址

5

我试图获取程序运行的机器的局域网IP地址,并将其与通过UDP传递的IP地址进行比较。

然而,当我使用以下代码时:

print str(socket.gethostbyname(socket.gethostname()))

它返回的是127.0.0.1,应该是192.168.1.9。
我查看了Linux机器,它获取了lo(loopBack)端口的IP地址。我不确定这是什么,但它应该获取eth0的IP地址。
我发现可以使用子进程执行bash命令"ifconfig eth0",但它会返回一大段字符串。虽然我可以将其处理成所需内容,但它将在Beaglebone上每秒运行3次左右,因此我希望它更高效一些。
有没有更优雅的方法来实现这一点?
我能否只更改gethostname的目标?
为什么它要针对lo端口?
谢谢你的帮助,maners先生。

如果有人正在尝试这样做,并且他们拥有始终具有互联网访问权限的服务器,可以在网站http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/上找到解决问题的方法。但是我的服务器不会始终具有互联网访问权限,因此我无法使用它。 - Poodimizer
2个回答

4

尝试返回机器的完全限定域名:

print str(socket.gethostbyname(socket.getfqdn()))

/etc/hosts 可能有一个将主机名解析为 127.0.0.1 的条目,这就是为什么 socket.gethostbyname() 没有返回您期望的内容的原因。

原始问题在此处提出并回答:here,但快速浏览中没有注意到 socket.getfqdn() 的解决方案。如果您决定采用这种方法,这里是解析 ifconfig 输出的解决方案。标准库似乎足以解决您的问题。


我一直以为hosts文件只是一个用于外部服务器的DNS查找表。但是print str(socket.gethostbyname(socket.getfqdn()))返回了相同的结果(127.0.1.1)。 - Poodimizer
@Poodimizer socket.getfqdn() 返回什么?查看您的hosts文件可能也会有帮助。 - Bryan
你是对的,hosts文件中有: 127.0.0.1 localhost 127.0.1.1 omap我现在遇到了一个错误,所以无法运行socket.fqdn()。必须重新启动服务器。 - Poodimizer
getfqdn()返回omap。那么这个文件是基于什么的呢?我需要在启动时手动更改这个文件来匹配eth0的IP地址吗? - Poodimizer
如果socket.getfqdn()返回omap(我假设这是主机名),那么应该从socket.gethostbyname()返回有效的IP。不应该修改hosts文件。解决您收到的错误并检查结果。 - Bryan
嗯,它确实解析为omap,但如果它应该具有以太网端口的有效局域网IP地址,则hosts文件是错误的。 - Poodimizer

1

netifaces 看起来是一个相当不错的 Python 模块,应该能够为您解决问题。


这看起来非常有前途。我一定会去看看并回复你。 - Poodimizer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接