如何在Python中获取全球IP地址?

4

我正在将Bash代码转换为Python代码。 在Bash代码中,我通过以下方式获取主机自己的全局IP地址:

hostname -I  # output -> 19x.xxx.xxx.xxx xxxx:xxxx:....

19x.xxx.xxx.xxx是本机的全局IP地址。

我尝试在Python中获取全局IP地址,方法如下:

import socket
name=socket.gethostname()
id_address=socket.gethostbyname(name)
print("id_address = {0}".format(id_address))

输出结果是本地主机地址,例如:
127.xxx.xxx.xxx

我能否用Python获取全局IP地址?


这个-I标志对于主机名来说很有趣,在BSD或OS X上似乎不可用,你能告诉我你正在使用哪个程序吗?如果可以的话,我们也许能够确定你需要在Python中做什么。此外,如果必要的话,你可以在Python中调用一个shell命令。 - jmercouris
@jmercouris:感谢您的评论。我正在使用4.4.0-22-generic #39-Ubuntu。我可以在bash shell终端中调用“hostname -I”。这是您想要的答案吗?恐怕我无法理解您真正想要什么,因为我不是这个领域的专家。 - mora
1
这可能会有所帮助:https://dev59.com/CWAf5IYBdhLWcg3w3l2l#30990617 - Leon
从 man 页面中的 -I 标志:显示主机的所有网络地址。此选项枚举所有网络接口上配置的地址。省略了环回接口和 IPv6 链路本地地址。与选项 -i 相反,此选项不依赖于名称解析。不要对输出的顺序做任何假设。 - VPfB
请注意,“全局IP”是一个主观术语,可能会有重复的问题。如何在Python中获取eth0的IP地址? - match
2个回答

2

请注意,这将返回您的“首选”IP地址,无论是IPv4还是IPv6。您必须仅使用v4.ident.me处理仅限于IPv4的情况;更多详细信息请参阅https://api.ident.me。 - Pierre Carrier

1
您需要使用连接到互联网的计算机/服务器来获取此信息。您自己的计算机只能提供本地网络上网络卡的IP地址,例如类似于192.16.8。 您可以使用whatismyip模块获取您的外部公共IP地址。它没有依赖项,仅使用Python 3标准库。它连接到公共STUN服务器和what-is-my-ip网站以查找IPv4或IPv6地址。运行pip install whatismyip 示例:
>>> import whatismyip
>>> whatismyip.amionline()
True
>>> whatismyip.whatismyip()  # Prefers IPv4 addresses, but can return either IPv4 or IPv6.
'69.89.31.226'
>>> whatismyip.whatismyipv4()
'69.89.31.226'
>>> whatismyip.whatismyipv6()
'2345:0425:2CA1:0000:0000:0567:5673:23b5'

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