我正在为本地网络编写聊天程序 . 我希望能够识别计算机并使用Python获取用户设置的计算机名称 .
使用socket及其gethostname()功能 . 这将获得运行Python解释器的计算机的 hostname :
hostname
import socket print(socket.gethostname())
这两个都非常便携:
import platform platform.node() import socket socket.gethostname()
使用 HOST 或 HOSTNAME 环境变量的任何解决方案都不可移植 . 即使它在您运行它时在您的系统上运行,它也可能在cron等特殊环境中运行时不起作用 .
HOST
HOSTNAME
你可能会加载os模块,所以另一个建议是:
import os myhost = os.uname()[1]
os.getenv('HOSTNAME') 和 os.environ['HOSTNAME'] don 't always work. In cron jobs and WSDL, HTTP HOSTNAME isn' t set . 改为使用它:
os.getenv('HOSTNAME')
os.environ['HOSTNAME']
import socket socket.gethostbyaddr(socket.gethostname())[0]
它始终(即使在Windows上)返回一个完全限定的主机名,即使您在/ etc / hosts中定义了一个短别名 .
如果在/ etc / hosts中定义了别名,则 socket.gethostname() 将返回别名 . platform.uname()[1] 做同样的事情 .
socket.gethostname()
platform.uname()[1]
我遇到了上述情况不起作用的情况 . 这就是我现在使用的:
import socket if socket.gethostname().find('.')>=0: name=socket.gethostname() else: name=socket.gethostbyaddr(socket.gethostname())[0]
它首先调用gethostname来查看它是否返回看起来像主机名的东西,如果不是它使用我的原始解决方案 .
关于什么 :
import platform h = platform.uname()[1]
其实你可能想查看 platform.uname() 中的所有结果
platform.uname()
如果我是正确的,你正在寻找socket.gethostname函数:
>> import socket >> socket.gethostname() 'terminus'
socket.gethostname() 可以做到
来自至少python >= 3.3:
您可以使用 nodename 字段并避免使用数组索引:
nodename
os.uname().nodename
虽然,甚至os.uname的文档建议使用 socket.gethostname()
在某些系统上,主机名在环境中设置 . 如果是这种情况,os module可以通过os.getenv将其拉出环境 . 例如,如果HOSTNAME是包含所需内容的环境变量,则以下内容将获取它:
import os system_name = os.getenv('HOSTNAME')
更新:如评论中所述,这并不总是有效,因为不是每个人的环境都以这种方式设置 . 我相信在我最初回答这个问题的时候,我正在使用这个解决方案,因为这是我在网络搜索中找到的第一件事,当时它对我有用 . 由于缺乏便携性,我现在可能不会使用它 . 但是,我将此答案留作参考 . FWIW,如果您的环境具有系统名称并且您已经导入了os模块,它确实消除了对其他导入的需要 . 测试它 - 如果它不能在您希望程序运行的所有环境中工作,请使用提供的其他解决方案之一 .
我需要在我的PyLog配置文件中使用PC的名称,并且套接字库不可用,但是os库是 .
对于 Windows 我用过:
os.getenv('COMPUTERNAME', 'defaultValue')
其中defaultValue是一个字符串,用于防止返回None
10 回答
使用socket及其gethostname()功能 . 这将获得运行Python解释器的计算机的
hostname
:这两个都非常便携:
使用
HOST
或HOSTNAME
环境变量的任何解决方案都不可移植 . 即使它在您运行它时在您的系统上运行,它也可能在cron等特殊环境中运行时不起作用 .你可能会加载os模块,所以另一个建议是:
os.getenv('HOSTNAME')
和os.environ['HOSTNAME']
don 't always work. In cron jobs and WSDL, HTTP HOSTNAME isn' t set . 改为使用它:它始终(即使在Windows上)返回一个完全限定的主机名,即使您在/ etc / hosts中定义了一个短别名 .
如果在/ etc / hosts中定义了别名,则
socket.gethostname()
将返回别名 .platform.uname()[1]
做同样的事情 .我遇到了上述情况不起作用的情况 . 这就是我现在使用的:
它首先调用gethostname来查看它是否返回看起来像主机名的东西,如果不是它使用我的原始解决方案 .
关于什么 :
其实你可能想查看
platform.uname()
中的所有结果如果我是正确的,你正在寻找socket.gethostname函数:
socket.gethostname()
可以做到来自至少python >= 3.3:
您可以使用
nodename
字段并避免使用数组索引:虽然,甚至os.uname的文档建议使用
socket.gethostname()
在某些系统上,主机名在环境中设置 . 如果是这种情况,os module可以通过os.getenv将其拉出环境 . 例如,如果HOSTNAME是包含所需内容的环境变量,则以下内容将获取它:
更新:如评论中所述,这并不总是有效,因为不是每个人的环境都以这种方式设置 . 我相信在我最初回答这个问题的时候,我正在使用这个解决方案,因为这是我在网络搜索中找到的第一件事,当时它对我有用 . 由于缺乏便携性,我现在可能不会使用它 . 但是,我将此答案留作参考 . FWIW,如果您的环境具有系统名称并且您已经导入了os模块,它确实消除了对其他导入的需要 . 测试它 - 如果它不能在您希望程序运行的所有环境中工作,请使用提供的其他解决方案之一 .
我需要在我的PyLog配置文件中使用PC的名称,并且套接字库不可用,但是os库是 .
对于 Windows 我用过:
其中defaultValue是一个字符串,用于防止返回None