如何使用Python获取系统主机名?

我正在为本地网络编写聊天程序。我希望能够识别计算机并使用Python获取用户设置的计算机名称。

728208 次浏览

使用socket及其gethostname()功能。这将获取运行Python解释器的计算机的hostname

import socketprint(socket.gethostname())

如果我是对的,你正在寻找socket.gethostname函数:

>> import socket>> socket.gethostname()'terminus'

socket.gethostname()可以做

在某些系统上,主机名是在环境中设置的。如果您是这种情况,os模块可以通过os.getenv将其从环境中拉出来。例如,如果HOSTNAME是包含您想要的内容的环境变量,则以下代码将获得它:

import ossystem_name = os.getenv('HOSTNAME')

更新:正如评论中提到的,这并不总是有效的,因为不是每个人的环境都是这样设置的。我相信在我最初回答这个问题的时候,我正在使用这个解决方案,因为它是我在网络搜索中发现的第一件事,当时它对我有效。由于缺乏可移植性,我现在可能不会使用这个。然而,我将这个答案留给参考目的。FWIW,如果您的环境有系统名称并且您已经导入了os模块,它确实消除了其他导入的需要。测试它-如果它不能在您希望程序运行的所有环境中工作,请使用提供的其他解决方案之一。

这两个都非常便携:

import platformplatform.node()
import socketsocket.gethostname()

任何使用HOSTHOSTNAME环境变量的解决方案都是不可移植的。即使它在您的系统上运行,在特殊环境(如cron)中运行时也可能不起作用。

关于什么:

import platform
h = platform.uname()[1]

实际上,您可能希望查看platform.uname()中的所有结果

os.getenv('HOSTNAME')os.environ['HOSTNAME']并不总是有效。在cron作业和WSDL中,未设置HTTP HOSTNAME。改为使用:

import socketsocket.gethostbyaddr(socket.gethostname())[0]

它总是(即使在Windows上)返回一个完全限定的主机名,即使您在/etc/hosts中定义了一个短别名。

如果您在/etc/hosts中定义了别名,那么socket.gethostname()将返回别名。platform.uname()[1]做同样的事情。

我遇到了一个上面的方法不起作用的情况。这是我现在使用的:

import socketif socket.gethostname().find('.')>=0:name=socket.gethostname()else:name=socket.gethostbyaddr(socket.gethostname())[0]

它首先调用gethostname来查看它是否返回看起来像主机名的东西,如果不是,它使用我的原始解决方案。

无论如何,您都可能会加载os模块,因此另一个建议是:

import osmyhost = os.uname()[1]

我需要在PyLog conf文件中使用的PC名称,套接字库不可用,但os库可用。

对于windows我使用:

os.getenv('COMPUTERNAME', 'defaultValue')

其中defaultValue是一个字符串,以防止返回无

从至少python>=3.3

您可以使用字段nodename并避免使用数组索引:

os.uname().nodename

虽然,即使是os.uname的留档也建议使用socket.gethostname()

你必须执行这行代码

sock_name = socket.gethostname()

然后您可以使用名称来查找地址:

print(socket.gethostbyname(sock_name))

要获得完全限定的主机名,请使用socket.getfqdn()

import socket
print socket.getfqdn()