Answers:
使用socket
及其gethostname()
功能。这将获得hostname
运行Python解释器的计算机的名称:
import socket
print(socket.gethostname())
socket.getfqdn()
这两个都是可移植的:
import platform
platform.node()
import socket
socket.gethostname()
使用HOST
或HOSTNAME
环境变量的任何解决方案都是不可移植的。即使它在您的系统上运行时也可以运行,但是在cron等特殊环境中运行时也可能无法运行。
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]
应该是跨平台的并且支持环境变量(如果存在的话)-允许在紧急情况下进行某些用户控制,例如HOSTNAME=correct python xyz.py
无论如何,您可能都将加载os模块,因此另一个建议是:
import os
myhost = os.uname()[1]
os
模块的解决方案。它不是便携式的,也不是很准确,但还是很方便。
platform.uname()[1]
,它在Windows上也可以使用。
关于什么 :
import platform
h = platform.uname()[1]
其实你可能想看看所有的结果 platform.uname()
os.getenv('HOSTNAME')
而且os.environ['HOSTNAME']
不总是工作。在cron作业和WSDL中,未设置HTTP HOSTNAME。使用此代替:
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来查看它是否返回类似于主机名的内容,如果不是,则使用我原来的解决方案。
socket.getfqdn()
,尽管这不是OP所要求的
在某些系统上,主机名是在环境中设置的。如果是这种情况,则os模块可以通过os.getenv将其拉出环境。例如,如果HOSTNAME是包含所需内容的环境变量,则将通过以下方式获取它:
import os
system_name = os.getenv('HOSTNAME')
更新:如评论中所述,这并不总是可行,因为并非每个人的环境都是以此方式设置的。我相信,当我最初回答这个问题时,我正在使用此解决方案,因为这是我在网络搜索中发现的第一件事,当时对我有用。由于缺乏可移植性,我现在可能不会使用它。但是,我将这个答案留作参考。FWIW,如果您的环境具有系统名称并且您已经导入了os模块,那么它确实消除了其他导入的需要。测试它-如果它不能在您希望程序在其中运行的所有环境中都起作用,请使用提供的其他解决方案之一。
我需要在PyLog conf文件中使用PC的名称,并且套接字库不可用,但是os库可用。
对于Windows,我使用了:
os.getenv('COMPUTERNAME', 'defaultValue')
其中defaultValue是防止返回None的字符串
您必须执行此行代码
sock_name = socket.gethostname()
然后,您可以使用该名称来查找addr:
print(socket.gethostbyname(sock_name))