从python OSError执行bash命令:Errno 2]

2024-04-25 18:04:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python很陌生。当我使用下面的python代码执行以下命令以获取x86服务器上的CPU内核总数时,我得到了如下错误:

########################Code#######################
#!/usr/bin/python
import os
import re
import subprocess
os.system('clear')

#CPU core count check
flag=0
p = subprocess.Popen(['cat /proc/cpuinfo | grep -i processor | wc -l'], stdout=subprocess.PIPE)
print p.communicate(1)

##############################Output####################

Traceback (most recent call last):
  File "./chk_config.py", line 9, in <module>
    p = subprocess.Popen(['cat /proc/cpuinfo | grep -i processor | wc -l'], stdout=subprocess.PIPE)
  File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

os.popen可以工作,但我不想使用os.popen,因为它在我想忽略的总核心计数的末尾打印None


Tags: inpyimportosusrlineproccpu
1条回答
网友
1楼 · 发布于 2024-04-25 18:04:02

首先,除非提供了shell=True,否则子进程不会理解命令中的|,或者通常在shell中运行该命令。相反,您的程序将尝试找到一个命令/usr/bin/cat\ /proc/cpuinfo\ \|\ grep\ -i\ processor\ \|\ wc\ -l,这当然失败了。在

解决方案是添加shell=True在shell中执行命令:

p = subprocess.Popen('grep -i processor /proc/cpuinfo | wc -l',
                     stdout=subprocess.PIPE, shell=True)

但是,也可以用Python构建管道:

^{pr2}$

但话说回来,您所使用的方法在几个方面都有缺陷——您将工作委托给shell,而python会做得非常好。另外,在某些计算机上,model name字段可能包含单词processor,或者添加一个新字段来添加该内容,那么您的方法就会被破坏,因此我建议您用纯python编写代码:

cpus = 0
with open('/proc/cpuinfo') as f:
    for line in f:
        if line.partition(':')[0].strip() == 'processor':
            cpus += 1

但所有这些都是没有用的,因为Python已经知道您有多少cpu,而且这肯定比您可以想到的任何bash命令都更易于移植:

>>> import multiprocessing
>>> multiprocessing.cpu_count()
4

相关问题 更多 >