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

Joh*_*ohn 628 python hostname

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

Ale*_*lex 965

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

import socket
print(socket.gethostname())
Run Code Online (Sandbox Code Playgroud)

  • 请注意,对于FQDN,您可以使用`socket.getfqdn()` (72认同)
  • 好吧,那不对.它适用于我离线和家庭,但现在我是一个办公室,这将返回一个不同的主机名. (68认同)
  • @DataGreed那是因为你的主机名正在改变.不是python的问题. (24认同)
  • 只是想知道socket.gethostname()和os.uname()[1]或platform.uname()[1]之间有什么区别 (5认同)
  • @DataGreed 1.我很确定它不是"随机"的,虽然它可能对你有所帮助.2.问题是"系统主机名",而不是"系统名称".3.对于大量系统(不可否认不包括Windows),主机和系统名称是相同的. (4认同)
  • @fortran嗯,这不是开玩笑,每当我连接办公室的wifi时,我的笔记本电脑主机名随机改变.我猜他们这里有一些有问题的网络设置. (3认同)

rob*_*ert 363

这两个都非常便携:

import platform
platform.node()

import socket
socket.gethostname()
Run Code Online (Sandbox Code Playgroud)

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

  • `python -m timeit"import platform; platform.node()"1000000循环,最好3:每循环使用0.74 (7认同)
  • platform.node()甚至比os.getenv更快.gethostname甚至不是竞争者.但如果时间不是一个因素:`import os,platform; os.getenv('HOSTNAME',os.getenv('COMPUTERNAME',platform.node())).split('.')[0]`应该是跨平台的,如果它们存在则支持环境变量 - 这允许一些用户控制在紧急情况下,例如`HOSTNAME = correct python xyz.py` (6认同)
  • 好吧,半便携式.在某些平台上,platform.node()提供fqdn,而在其他平台上,只提供主机名 (5认同)
  • @codeforester `platform.node()` 返回一个缓存值。`socket.gethostname()` 没有。示例:`导入平台、套接字、子进程;p = lambda: print(platform.node(), socket.gethostname()); p(); subprocess.run(['sudo', 'hostnamectl', 'set-hostname', foo']); p()`。虽然这两个函数在第一次调用时返回相同的正确值,但在主机名更改后,“platform.node()”仍然返回旧值。 (5认同)
  • `python -m timeit"import socket; socket.gethostname()"10000循环,最佳3:76.3 usec每循环 (3认同)
  • @BelowtheRadar不用担心,我通常每个脚本只调用一次这些. (3认同)

小智 107

你可能会加载os模块,所以另一个建议是:

import os
myhost = os.uname()[1]
Run Code Online (Sandbox Code Playgroud)

  • Windows不支持os.uname:http://docs.python.org/dev/library/os#os.uname (15认同)
  • 你也可以使用os.uname().nodename来使它在3.3+中更加明显 (8认同)
  • 使用`os`模块的解决方案+1.不便携,不准确,但无论如何都很方便. (7认同)
  • @fantabolous你可能不应该使用像"下面"这样的位置词,因为在着陆过程中答案可能会发生变化;) (6认同)
  • 下面的答案给出了类似的`platform.uname()[1]`,它可以在Windows上运行. (4认同)

小智 58

关于什么 :

import platform

h = platform.uname()[1]
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,它适用于Windows(不像`os.uname()`) (3认同)

小智 57

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

import socket
socket.gethostbyaddr(socket.gethostname())[0]
Run Code Online (Sandbox Code Playgroud)

它总是(即使在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]
Run Code Online (Sandbox Code Playgroud)

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

  • 你可能想要`socket.getfqdn()`,虽然它不是OP要求的 (14认同)

小智 16

你必须执行这行代码

sock_name = socket.gethostname()
Run Code Online (Sandbox Code Playgroud)

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

print(socket.gethostbyname(sock_name))
Run Code Online (Sandbox Code Playgroud)


ter*_*nus 15

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

>> import socket
>> socket.gethostname()
'terminus'
Run Code Online (Sandbox Code Playgroud)


Ris*_*sal 11

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

import socket

print socket.getfqdn()
Run Code Online (Sandbox Code Playgroud)


vpi*_*833 10

socket.gethostname() 能做


Shu*_*ary 10

从至少python> = 3.3:

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

os.uname().nodename
Run Code Online (Sandbox Code Playgroud)

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

  • 根据[doc](https://docs.python.org/3.8/library/os.html#os.uname),`os.uname`仅在“Unix的最新风格”上可用 (2认同)

Gre*_*att 6

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

import os
system_name = os.getenv('HOSTNAME')
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我来说返回“无”。根据您发布的链接,这意味着变量“HOSTNAME”不存在......:-/ (6认同)

Bil*_*idd 6

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

对于我使用的Windows

os.getenv('COMPUTERNAME', 'defaultValue')
Run Code Online (Sandbox Code Playgroud)

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

  • COMPUTERNAME 是 Microsoft 独有的环境变量,因此不可移植。 (15认同)
  • @BillKidd OP 在问题中提到了 Windows、OS X 和 Linux,因此需要系统可移植性是一个非常合理的假设。 (9认同)
  • 是的,但它确实适用于 MS 系统,如果适合,它就可以工作。很多时候,这里的人们过于关注速度或平台独立性,而实用性和问题使它们变得无关紧要。 (2认同)