【问题标题】:Execute bash commands from python - OSError: [Errno 2]从 python 执行 bash 命令 - OSError: [Errno 2]
【发布时间】:2017-06-26 15:48:10
【问题描述】:

我对 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/

【问题讨论】:

  • 尝试使用键盘上的Enter 键...此外,您可以通过缩进四个空格来创建代码块。
  • 调试你的错误。命令行提示符下的“cat /proc/cpuinfo | grep -i processor | wc -l”行输出什么?是否可以执行“p = subprocess.Popen([], stdout=subprocess.PIPE)”这行,其中是之前获取的一条信息?
  • 这是因为您正在尝试运行一个名为 'cat /proc/cpuinfo | grep -i 处理器 | wc -l'。
  • 你不这样做,也不应该这样做。

标签: python python-2.7 subprocess


【解决方案1】:

注意:使用以下命令,因为 Python 已经知道你有多少 CPU,并且这保证比你能想出的任何 bash 命令更便携:

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

关于你的命令:

首先subprocess不会理解命令中的|,或者一般是在shell中运行命令,除非提供了shell=True。相反,您的程序会尝试查找命令/usr/bin/cat\ /proc/cpuinfo\ \|\ grep\ -i\ processor\ \|\ wc\ -l,这当然会失败。

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

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

不过,也可以用 Python 构建管道:

grep = subprocess.Popen('grep -i processor /proc/cpuinfo'.split(), stdout=subprocess.PIPE)
wc = subprocess.Popen('wc -l'.split(), stdin=grep.stdout, stdout=subprocess.PIPE)
output = wc.communicate()

但话又说回来,您使用的方法在几个方面存在缺陷 - 您将工作委派给 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

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 2015-05-06
    • 2019-08-14
    • 2017-08-02
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多