代码之家  ›  专栏  ›  技术社区  ›  John Raymund

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

  •  578
  • John Raymund  · 技术社区  · 14 年前

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

    11 回复  |  直到 5 年前
        1
  •  894
  •   the Tin Man    9 年前

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

    import socket
    print(socket.gethostname())
    
        2
  •  338
  •   robert vano    14 年前

    这两种产品都非常便携:

    import platform
    platform.node()
    
    import socket
    socket.gethostname()
    

    任何使用 HOST HOSTNAME 环境变量不可移植。即使它在运行时在您的系统上工作,在cron等特殊环境中运行时也可能不工作。

        3
  •  92
  •   mike0042    11 年前

    无论如何,您可能会加载OS模块,因此另一个建议是:

    import os
    myhost = os.uname()[1]
    
        4
  •  56
  •   Stabledog Tom Ekberg    12 年前

    os.getenv('HOSTNAME') os.environ['HOSTNAME'] 不要总是工作。在cron作业和wsdl中,没有设置HTTP主机名。改为使用:

    import socket
    socket.gethostbyaddr(socket.gethostname())[0]
    

    它始终(甚至在Windows上)返回完全限定的主机名,即使在 /ETC/主机 .

    如果在 /ETC/主机 然后 socket.gethostname() 将返回别名。 platform.uname()[1] 做同样的事。

    我遇到了一个上面没有用的案子。这就是我现在使用的:

    import socket
    if socket.gethostname().find('.')>=0:
        name=socket.gethostname()
    else:
        name=socket.gethostbyaddr(socket.gethostname())[0]
    

    它首先调用gethostname,看看它是否返回类似于主机名的内容,如果不是,则使用我的原始解决方案。

        5
  •  53
  •   Esailija    13 年前

    如何:

    import platform
    
    h = platform.uname()[1]
    

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

        6
  •  16
  •   terminus    14 年前

    如果我是正确的,您将查找socket.gethostname函数:

    >> import socket
    >> socket.gethostname()
    'terminus'
    
        7
  •  11
  •   vpit3833    14 年前

    socket.gethostname() 能做

        8
  •  7
  •   Shubham Chaudhary    6 年前

    至少从 python >= 3.3 :

    你可以用这个场地 nodename 避免使用数组索引:

    os.uname().nodename
    

    尽管如此,即使是 os.uname 建议使用 socket.gethostname()

        9
  •  3
  •   GreenMatt    9 年前

    在某些系统上,主机名是在环境中设置的。如果你是这样的话, os module 可以通过 os.getenv . 例如,如果hostname是包含所需内容的环境变量,则以下内容将得到它:

    import os
    system_name = os.getenv('HOSTNAME')
    

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

        10
  •  0
  •   Nhu Trinh    8 年前

    我需要在pylog conf文件中使用pc的名称,而socket库不可用,但是os库可用。

    为了 窗户 我用过:

    os.getenv('COMPUTERNAME', 'defaultValue')
    

    其中,defaultvalue是一个字符串,用于防止返回任何值。

        11
  •  0
  •   Parzifal Kali    5 年前

    你必须执行这行代码

    sock_name = socket.gethostname()
    

    然后您可以使用名称查找地址:

    print(socket.gethostbyname(sock_name))