2017-02-08 4 views
0

Я довольно новичок в Python. Когда я выполняю следующую команду, чтобы получить общее количество ядер процессора на моем сервере x86, используя следующий код python, я получаю ошибку, как показано ниже;Выполнять команды bash из python - OSError: [Errno 2]

########################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 в конце общего количества ядра, которые я хочу, чтобы опустить/

+0

Попробуйте использовать ваш ключ 'Enter' на клавиатуре ... Кроме того, вы можете cr eate, путем отступов с четырьмя пробелами. – ryugie

+0

Отладить свою ошибку. Что выводит строка «cat/proc/cpuinfo | grep -i processor | wc -l» в командной строке? Можете ли вы выполнить строку «p = subprocess.Popen ([], stdout = subprocess.PIPE)», где - это ранее полученная информация? –

+0

Это потому, что вы пытаетесь запустить литеральную программу под названием «cat/proc/cpuinfo | процессор grep -i | wc-1 '. –

ответ

6

Прежде всего, подпроцесс не поймет | внутри команды или вообще запустить команду в оболочке, если не предусмотрено shell=True. Вместо этого ваша программа попытается найти команду /usr/bin/cat\ /proc/cpuinfo\ \|\ grep\ -i\ processor\ \|\ wc\ -l, которая, конечно же, не удалась.

Решение добавить 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() 

Но затем снова , подход, который вы используете, ошибочен несколькими способами - вы делегируете работу оболочке, когда python будет работать отлично. Кроме того, на некоторых компьютерах model name поле может содержать слово processor или новое поле будет добавлен с этим содержимым, и ваш подход будет нарушен, то, таким образом, я полагаю, что вы писали код в чистом питоне вместо:

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

Но все это бесполезно, потому что Python уже знает, сколько процессоров у вас есть, и это гарантированно будет гораздо более компактен, чем любая команда Баш, что вы можете придумать:

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