2017-02-08 9 views
0

私はPythonにはかなり新しいです。次のコマンドを実行して、x86サーバー上のCPUコアの合計数を取得するには、次のようなpythonコードを使用します。Pythonからbashコマンドを実行する - 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作品が、私はそれは私がすべての/

+0

が使用してみてくださいあなたのキーボードの 'Enter'キー...また、あなたはcr 4つのスペースをインデントしてコードブロックを評価します。 – ryugie

+0

エラーをデバッグします。コマンドラインプロンプトで "cat/proc/cpuinfo | grep -i processor | wc -l"行の出力はどうなりますか? "]、stdout = subprocess.PIPE"という行を実行できますか? –

+0

これは、 'cat/proc/cpuinfo |'というリテラルプログラムを実行しようとしているためです。 grep -iプロセッサー| wc -l '。 –

答えて

6

ファーストを省略したい総コア数の終わりにNoneを出力するので、サブプロセスが|を理解することはありませんos.popenを使用したくありませんshell=Trueが指定されていない場合は、コマンド内で実行するか、通常はシェルでコマンドを実行します。代わりにあなたのプログラムはコマンド/usr/bin/cat\ /proc/cpuinfo\ \|\ grep\ -i\ processor\ \|\ wc\ -lを見つけようとしますが、もちろん失敗します。再び

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() 

しかし:

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

しかし、Pythonでパイプラインを構築することも可能である:

ソリューションは、シェルでコマンドを実行するshell=Trueを追加することですあなたが使っているアプローチにはいくつかの点で欠陥があります。つまり、Pythonが完全にうまくいくようになると、シェルに作業を委任しています。また、一部のコンピュータでは、model nameフィールドにprocessorという単語が含まれている場合や、そのフィールドに新しいフィールドを追加するとコードが壊れてしまう場合があるので、純粋なPythonでコードを書き込んでください:


しかし、Pythonはすでにあなたが持っているどのように多くのCPUを知っており、これはあなたが思い付くことができる任意のbashコマンドよりもはるかに移植性が保証されているので、このすべては、無用です:

>>> import multiprocessing 
>>> multiprocessing.cpu_count() 
4 
関連する問題