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

如何使用Python获取系统主机名?,python,hostname,Python,Hostname,我正在为本地网络编写一个聊天程序。我希望能够识别计算机并使用Python获取用户设置的计算机名。使用及其功能。这将获得运行Python解释器的计算机的主机名: import socket print(socket.gethostname()) 如果我没有错,您正在查找socket.gethostname函数: >> import socket >> socket.gethostname() 'terminus' socket.gethostname()在某些系统上,主

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

使用及其功能。这将获得运行Python解释器的计算机的主机名:

import socket
print(socket.gethostname())

如果我没有错,您正在查找socket.gethostname函数:

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

socket.gethostname()
在某些系统上,主机名是在环境中设置的。如果您是这样,则可以通过将其从环境中拉出。例如,如果HOSTNAME是包含所需内容的环境变量,则以下内容将得到它:

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

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

这两种解决方案都非常便携:

import platform
platform.node()

import socket
socket.gethostname()
任何使用
主机
主机名
环境变量的解决方案都是不可移植的。即使它在您运行时在您的系统上工作,但在诸如cron之类的特殊环境中运行时也可能不工作。

那么:

import platform

h = platform.uname()[1]
实际上,您可能需要查看
platform.uname()

os.getenv('HOSTNAME')
os.environ['HOSTNAME']
中的所有结果。在cron作业和WSDL中,未设置HTTP主机名。改用这个:

import socket
socket.gethostbyaddr(socket.gethostname())[0]
即使您在/etc/hosts中定义了短别名,它也总是(即使在Windows上)返回完全限定的主机名

如果在/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以查看是否返回类似于主机名的内容,如果不是,则使用我的原始解决方案。

您可能会加载操作系统模块,因此另一个建议是:

import os
myhost = os.uname()[1]

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

对于窗口我使用了:

os.getenv('COMPUTERNAME', 'defaultValue')
其中defaultValue是一个字符串,用于防止至少从以下位置返回None:

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

os.uname().nodename

尽管如此,即使是的文档也建议使用
socket.gethostname()

sock_name = socket.gethostname()
然后您可以使用名称查找地址:

print(socket.gethostbyname(sock_name))

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



对我来说,它返回“无”。根据您发布的链接,这意味着变量“HOSTNAME”不存在…:-/@约翰:你在窗户上吗?它在Linux机器上对我有效,但在Windows上也没有。@MuhiaNJoroge:我想这取决于你的实现/安装。当我写下那个答案时,我正站在一个红帽子盒子上,它起了作用。现在我在Ubuntu上,但它不工作。我已经修改了答案。在联想NAS中不工作,返回None。现在我正在使用import-socket-print(socket.gethostname())@ruimatins:正如我所说的,它似乎并不适用于任何地方。很高兴你发现了一些有用的东西。你可能想要
socket.getfqdn()
,尽管这不是OP要求的
socket.gethostbyaddr(socket.gethostname())
在我的机器(运行FreeBSD)上返回
('localhost',['my-machine-name','my machine-namelocaldomain'],['::1'])
,因此,返回第一个元素只返回
localhost
。(同时,
socket.gethostname()
为我返回
my machine name
),请注意,对于FQDN,您可以使用
socket.getfqdn()
只是想知道socket.gethostname()和os.uname()[1]或platform.uname()[1]之间有什么区别。这是可移植的吗?+1用于使用
os
模块的解决方案。不是便携的,也不是很准确,但是很方便。Windows不支持os.uname().nodename:您也可以使用os.uname().nodename使其在3.3+中更为明显。下面的答案给出了类似的
平台。uname()[1]
,它在Windows上工作。@fantabolous您可能不应该使用像“below”这样的位置词因为答案可能在着陆过程中发生了变化;)嗯,半便携式。在某些平台上,platform.node()提供fqdn,而在其他平台上,只有hostname
python-m timeit“导入套接字;socket.gethostname()”10000个循环,每个循环3:76.3 usec的最佳值导入平台;platform.node()”1000000个循环,每个循环3:0.74 usec的最佳值不要担心,通常每个脚本只调用其中一个。platform.node()甚至比os.getenv更快。gethostname甚至不是竞争者。但如果时间不是一个因素:
导入操作系统、平台;os.getenv('HOSTNAME',os.getenv('COMPUTERNAME',platform.node()).split('.')[0]
应该是跨平台的,如果存在环境变量,则支持它们-这允许在紧急情况下进行一些用户控制,例如
HOSTNAME=correct python xyz.py
COMPUTERNAME是一个仅限Microsoft的环境变量,因此不可移植。是的,但它确实适用于M.S.系统,如果适合,它也可以工作。很多时候,这里的人们在速度或平台独立性上过于纠结,因为实用性和问题使它们变得无关紧要。@BillKidd OP在问题中提到了Windows、OS X和Linux,因此需要系统可移植性是一个非常合理的假设。@BillKidd
import socket

print socket.getfqdn()