818

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

4

12 回答 12

1271

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

import socket
print(socket.gethostname())
于 2010-11-24T21:36:29.377 回答
439

这两个都非常便携:

import platform
platform.node()

import socket
socket.gethostname()

任何使用HOSTHOSTNAME环境变量的解决方案都不可移植。即使它在您运行时在您的系统上运行,但在 cron 等特殊环境中运行时可能无法正常运行。

于 2010-11-24T21:53:48.573 回答
159

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

import os
myhost = os.uname()[1]
于 2013-03-13T19:06:15.757 回答
72

关于什么 :

import platform

h = platform.uname()[1]

实际上你可能想看看所有的结果platform.uname()

于 2012-01-02T10:14:01.607 回答
63

os.getenv('HOSTNAME')并且os.environ['HOSTNAME']不要总是工作。在 cron 作业和 WSDL 中,未设置 HTTP HOSTNAME。改用这个:

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

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

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

我遇到了上述方法不起作用的情况。这就是我现在正在使用的:

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

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

于 2012-05-08T15:23:41.650 回答
29

至少从python >= 3.3开始:

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

os.uname().nodename

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

于 2018-04-02T12:01:00.020 回答
23

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

>> import socket
>> socket.gethostname()
'terminus'
于 2010-11-24T21:37:53.573 回答
13

socket.gethostname()能做

于 2010-11-24T21:38:13.153 回答
7

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

对于我使用的Windows :

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

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

于 2015-06-09T09:50:28.287 回答
7

你必须执行这行代码

sock_name = socket.gethostname()

然后您可以使用名称查找 addr :

print(socket.gethostbyname(sock_name))
于 2019-03-10T12:30:16.310 回答
6

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

import os
system_name = os.getenv('HOSTNAME')

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

于 2010-11-24T21:43:33.870 回答
6

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

import socket

print socket.getfqdn()
于 2020-11-11T02:57:09.930 回答