在 Python 中,获取主机名(hostname)非常简单,主要使用内置的 socket 模块,下面我将为你详细介绍几种方法,并指出它们之间的区别和适用场景。

使用 socket.gethostname() (最常用)
这是最直接、最常用的方法,它会返回运行当前 Python 脚本的机器的主机名。
代码示例:
import socket
# 获取主机名
hostname = socket.gethostname()
print(f"当前机器的主机名是: {hostname}")
输出示例:
当前机器的主机名是: MyLaptop.local
特点:

- 简单快捷:只需一行代码即可完成。
- :返回的是操作系统配置的“主机名”(hostname),
MyPC,DESKTOP-ABC123,server01.prod等,它不一定是完全限定的域名(FQDN)。 - 用途:非常适合在日志记录、配置文件、内部网络通信等场景下标识当前机器。
使用 socket.getfqdn() (获取完全限定域名)
如果你需要获取更完整的域名信息,MyLaptop.local 或 server01.example.com,应该使用 getfqdn()。
代码示例:
import socket
# 获取完全限定域名
fqdn = socket.getfqdn()
print(f"当前机器的完全限定域名是: {fqdn}")
# 你也可以用它来获取另一个主机的FQDN
other_host_fqdn = socket.getfqdn('8.8.8.8')
print(f"Google DNS的FQDN是: {other_host_fqdn}")
输出示例:
当前机器的完全限定域名是: MyLaptop.local
Google DNS的FQDN是: dns.google
特点:

- 返回完整域名:它会尝试将一个简单的主机名解析为完全限定的域名。
gethostname()返回的是server01,getfqdn()可能会返回server01.example.com。 - 依赖DNS解析:它的功能依赖于系统的 DNS 解析配置,DNS 配置不正确或网络不通,它可能返回与
gethostname()相同的结果。 - 用途:当你在需要明确主机在网络中完整身份的场景下使用,例如配置 Web 服务器、邮件服务器或在复杂的网络环境中进行服务发现。
使用 platform 模块
platform 模块提供了更多关于系统平台的信息,主机名只是其中之一。
代码示例:
import platform
# 获取主机名
hostname_platform = platform.node()
print(f"使用 platform.node() 获取的主机名: {hostname_platform}")
# 获取更多系统信息
print(f"操作系统: {platform.system()}") # e.g., 'Windows', 'Linux', 'Darwin'
print(f"系统版本: {platform.release()}") # e.g., '10', '20.04', '21.6.0'
print(f"机器信息: {platform.machine()}") # e.g., 'x86_64', 'AMD64'
输出示例:
使用 platform.node() 获取的主机名: MyLaptop.local
操作系统: Linux
系统版本: 5.15.0-76-generic
机器信息: x86_64
特点:
- 信息更丰富:除了主机名,还能获取操作系统、版本、架构等多种信息。
- 底层实现:在大多数系统上,
platform.node()内部也是调用了socket.gethostname()。 - 用途:当你需要收集系统信息用于报告、调试或环境检测时,
platform模块是更好的选择。
总结与如何选择
| 方法 | 模块 | 返回值 | 特点 | 推荐场景 |
|---|---|---|---|---|
socket.gethostname() |
socket |
操作系统配置的主机名 (e.g., server01) |
最简单、最直接,不依赖DNS | 日志、配置、内部标识,绝大多数情况下的首选 |
socket.getfqdn() |
socket |
完全限定域名 (e.g., server01.example.com) |
依赖DNS解析,返回更完整的域名 | 需要明确网络身份,如Web服务器配置 |
platform.node() |
platform |
主机名 (与 gethostname() 通常相同) |
提供丰富的系统信息,主机名是其中一部分 | 需要同时获取操作系统、版本等多种信息时 |
- 如果你只是想知道“我叫什么名字”,用
socket.gethostname()。 - 如果你想知道“我在网络中的完整地址是什么”,用
socket.getfqdn()。 - 如果你不仅想知道名字,还想了解我的“户口本”(操作系统信息),用
platform.node()。
