【问题标题】:Getting name of windows computer running python script?获取运行python脚本的Windows计算机的名称?
【发布时间】:2010-10-22 10:27:00
【问题描述】:

我的网络上有几台 Windows 计算机将运行 python 脚本。根据运行此脚本的计算机,应在脚本中使用一组不同的配置选项。

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

假设脚本在名为 DARK-TOWER 的计算机上运行,​​我想写这样的东西:

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

是否有我可以使用的标准库或第三方库?

【问题讨论】:

    标签: python windows networking


    【解决方案1】:

    原来有三个选项(包括前面已经回答的两个):

    >>> import platform
    >>> import socket
    >>> import os
    >>> platform.node()
    'DARK-TOWER'
    >>> socket.gethostname()
    'DARK-TOWER'
    >>> os.environ['COMPUTERNAME']
    'DARK-TOWER'
    

    【讨论】:

    • 回答自己的问题可能被某些人认为是低俗的,但它完全没问题,根据常见问题解答:stackoverflow.com/faq
    • 我认为这一点也不坏,因为 Eric 将几个不同的响应编译到一个资源中,更不用说添加一个新的响应(平台)了。
    • 好的,所以这需要跟进:platform.node() 和 socket.gethostname() 有什么区别?他们会有所不同吗?
    • 在 posix 系统上,socket.gethostname() 返回 libc gethostname(),而 platform.node() 返回 platform.uname()[1],这与调用 libc uname()os.uname() 有点相关...看起来就像他们最终可能会在同一个地方,但他们采取完全不同的路径到达那里,我不会依赖于在不同平台上相同的价值。
    • 值得注意的是os.environ['COMPUTERNAME'] 将返回全部大写,而platform.node()socket.gethostname() 可以返回混合大小写。
    【解决方案2】:
    import socket
    socket.gethostname()
    

    【讨论】:

    • +1 因为这是最好的方法。这是最有效的跨平台调用。
    • platform.node() 也是跨平台的
    • 计算机名和主机名是两个不同的东西。例如,当您在 VPN 中时,您的主机名是 X,您的计算机名可以是 Y。这个答案是不正确的,因为问题是关于计算机名而不是主机名。
    【解决方案3】:

    【讨论】:

    • 这对我在 OS-X 10.6.8 上使用 Python 2.7.2 不起作用,它返回 None。但是,描述的其他方法确实有效。
    • @PeterGibson 我在 Ubuntu 12.04 上遇到了同样的事情。
    • 在 Ubuntu 16.04 上为我返回 None。有趣的是,HOSTNAME 是 bash 中定义的环境变量,但os.getenv('HOSTNAME') 也都返回None,而socket.gethostname() 返回正确的字符串。
    【解决方案4】:

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

    我更喜欢一起使用它们:

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

    在开发跨平台应用程序时我更喜欢它;)

    【讨论】:

    • 更简洁一点:如果 n1==n2 或 n2==n3: return n1 elif n2==n3: return n2 else: raise Exception("计算机名不相等")
    • @CharlesPlager 应该是:if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")n1 而不是n2
    • @dexteritas:你是对的。 (无论出于何种原因,它都不允许我对其进行编辑)。
    • 如果环境中不存在“COMPUTERNAME”,您可以使用 os.getenv("COMPUTERNAME") 返回 None 而不是引发错误。
    【解决方案5】:

    由于 python 脚本肯定会在 Windows 系统上运行,您应该使用 Win32 API GetComputerNameGetComputerNameEx

    您可以获得完全限定的 DNS 名称、NETBIOS 名称或各种不同的名称。

    import win32api
    win32api.GetComputerName()
    
    >>'MYNAME'
    

    或者:

    import win32api
    WIN32_ComputerNameDnsHostname = 1 
    win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)
    
    >> u'MYNAME'
    

    【讨论】:

      【解决方案6】:
      import socket
      pc = socket.gethostname()
      print pc
      

      【讨论】:

      • 请在答案中添加一些解释。
      • 此外,这个答案只是一个 10 岁的高度支持的其他 answer 的副本。
      【解决方案7】:

      我打赌gethostname 会很好用。

      【讨论】:

        猜你喜欢
        • 2015-03-28
        • 2022-11-02
        • 1970-01-01
        • 2010-10-02
        • 2010-11-29
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        相关资源
        最近更新 更多