You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用subprocess.Popen获取Python运行主机名时返回None的解决方法

问题原因与解决办法

问题根源

你的代码出现这种情况的核心原因:

  • subprocess.Popen(["hostname"])默认不会捕获子进程的输出,子进程的标准输出会直接继承父进程的输出流(也就是你的终端),而server.stdout因未设置重定向参数,默认值为None,所以print(server.stdout)会输出None。
  • 子进程的输出和父进程的print操作的执行顺序受IO缓冲机制影响,最终呈现出先输出None、再出现主机名的现象。

解决办法

方法1:正确使用subprocess捕获输出

如果你一定要用subprocess,需要显式重定向并读取子进程的输出:

用Popen的方式

import subprocess

# 重定向stdout为管道,text=True让输出以字符串形式返回
server = subprocess.Popen(["hostname"], stdout=subprocess.PIPE, text=True)
# 读取输出并去除首尾空白(包括换行符)
hostname = server.stdout.read().strip()
print(hostname)

更推荐的subprocess.run方式(高级API,更简洁安全)

import subprocess

# run方法会等待子进程完成,check=True确保命令执行失败时抛出异常
result = subprocess.run(["hostname"], stdout=subprocess.PIPE, text=True, check=True)
hostname = result.stdout.strip()
print(hostname)

方法2:直接使用Python标准库(更高效)

获取主机名根本不需要调用外部命令,Python标准库提供了更直接的方式:

使用socket模块

import socket

hostname = socket.gethostname()
print(hostname)

使用platform模块

import platform

hostname = platform.node()
print(hostname)

内容的提问来源于stack exchange,提问作者null92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:35:48