获取运行Python脚本的Windows计算机名称?

133

我在我的网络中有几台运行Python脚本的Windows计算机。根据运行该脚本的计算机不同,应使用不同的配置选项。

如何在Python脚本中获取该计算机的名称?

假设脚本正在名为DARK-TOWER的计算机上运行,我想编写类似于以下内容的代码:

>>> python.library.get_computer_name()
'DARK-TOWER'

有没有标准的或第三方库可以使用?

7个回答

218

事实证明有三个选项(包括之前已经回答的两个):

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME'] # WORK ONLY ON WINDOWS
'DARK-TOWER'

22
回答自己的问题可能会被一些人认为是不得体的,但正如常见问题解答(FAQ)所述,这是完全可以接受的:http://stackoverflow.com/faq。 - Stephan202
12
我认为这一点都不坏,因为Eric正在将几个不同的回复编译成一个单一的资源,更别提添加了一个新的平台。 - nilamo
7
好的,这需要进行后续跟进:platform.node()和socket.gethostname()有什么区别?它们是否会不同? - Jason S
5
在 POSIX 系统上,socket.gethostname() 返回 libc 库中的 gethostname(),而 platform.node() 返回 platform.uname()[1],后者与调用 libc 库中的 uname()os.uname() 有些相关。看起来它们可能会得到相同的结果,但是它们采取了截然不同的方法,我不会指望在不同的平台上这两个值相同。请注意,以上是对原文的翻译,并未对技术内容进行解释或更改。 - Peter Gibson
8
值得注意的是,os.environ['COMPUTERNAME'] 返回的字符串全部为大写,而 platform.node()socket.gethostname() 返回的字符串可能包含大小写混合的字符。 - MrNoob
显示剩余4条评论

49
import socket
socket.gethostname()

2
+1 对于这是最佳选择。这是最有效的跨平台调用。 - joshin4colours
1
platform.node()也是跨平台的 - Dmitry Dronov
计算机名称和主机名是两个不同的东西。例如,当您在VPN中时,您的主机名为X,而您的计算机名称可以是Y。这个答案是不正确的,因为问题是关于计算机名称而不是主机名。 - Xxxo
这对我有效,而使用os则不行。 - Chau Pham

23

7
在我使用的OS-X 10.6.8操作系统中,用Python 2.7.2编写的这段代码不起作用,它返回了None。不过,其他描述的方法可以正常工作。 - Peter Gibson
2
@PeterGibson 我在Ubuntu 12.04上也遇到了同样的问题。 - Daniel F
在Ubuntu 16.04上,对我来说返回None。有趣的是,在bash中,HOSTNAME是一个已定义的环境变量,但是os.getenv('HOSTNAME')也返回None,而socket.gethostname()则返回正确的字符串。 - Matt Hancock

18

正如Eric Palakovich Carr所说,你可以使用这三个变体。

我更喜欢同时使用它们:

def getpcname():
    n1 = platform.node()
    n2 = socket.gethostname()
    n3 = os.environ["COMPUTERNAME"]
    if n1 == n2 or n1 == n3:
        return n1
    elif n2 == n3:
        return n2
    else:
        raise Exception("Computernames are not equal to each other")

开发跨平台应用程序时,我更喜欢确保一切万无一失 ;)


1
稍微清晰一些:如果 n1==n2 或者 n2==n3: 返回 n1 elif n2==n3: 返回 n2 else: 抛出异常("计算机名称彼此不相等") - Charles Plager
2
@CharlesPlager 应该是这样的:如果 n1==n2 或者 n1==n3: 返回 n1 elif n2==n3: 返回 n2 else: 抛出异常("计算机名称不相等") (n1 替换 n2) - dexteritas
@dexteritas:你说得对。(出于某种原因,它不让我编辑。) - Charles Plager
您可以使用 os.getenv("COMPUTERNAME") 来获取环境变量中的 "COMPUTERNAME" 值,如果该值不存在,则返回 None 而非引发错误。 - busdriver

8

由于Python脚本肯定是运行在Windows系统上的,因此您应该使用Win32 API GetComputerNameGetComputerNameEx

您可以获取完全限定的DNS名称、NETBIOS名称或多种不同的内容。

import win32api
win32api.GetComputerName()

>>'MYNAME'

或者:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'

4
import socket
pc = socket.gethostname()
print pc

7
请在回答中始终添加一些解释。 - DaFois
3
此外,这个答案只是一个复制了10年前高赞的其他答案 - wovano

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接