Python 2.6中os.popen执行dmidecode管道命令报错求助
解决Python 2.6中使用os.popen执行管道命令的问题
你在Python 2.6里用os.popen执行管道命令时踩了几个典型的坑,我来帮你理清问题所在,以及给出正确的实现方式:
你之前写法的核心问题
os.popen不接受列表参数:它和subprocess.Popen的用法不同,os.popen的第一个参数必须是完整的shell命令字符串,而不是拆分后的命令列表。- 字符串单引号嵌套的语法错误:你写的
'awk '{print $5}''会让Python解析混乱——外层单引号到awk就结束了,后面的{print $5}会被当成非法代码,直接触发语法报错。 - 错误使用
stdout=subprocess.PIPE参数:os.popen根本没有这个关键字参数,它本身返回的就是一个类文件对象,你直接通过这个对象读取输出即可。
正确的实现代码
你需要把整个管道命令整合成一个合法的字符串,处理好引号的问题后传给os.popen:
import os # 方式1:用双引号包裹整个命令,内部单引号无需转义 cmd = "dmidecode | grep -i cpu | awk '{print $5}' | head -n1" # 方式2:用单引号包裹命令,内部单引号用反斜杠转义 # cmd = 'dmidecode | grep -i cpu | awk \'{print $5}\' | head -n1' # 执行命令并获取输出 pipe = os.popen(cmd) cpu_info = pipe.read().strip() # 读取输出并去除首尾空白字符 pipe.close() # 记得关闭管道释放资源 print(cpu_info)
额外优化提示
你还可以用with语句(Python 2.6及以上版本支持)来自动管理管道对象,避免手动关闭的麻烦:
import os cmd = "dmidecode | grep -i cpu | awk '{print $5}' | head -n1" with os.popen(cmd) as pipe: cpu_info = pipe.read().strip() print(cpu_info)
内容的提问来源于stack exchange,提问作者user3102144
相关产品推荐
相关产品推荐

