2017-12-10 17 views
-1

システムコマンドを呼び出す方法を検索すると、Pythonに多くのメソッドがあることがわかりました。 1はシステムを呼び出すの異なる方法のいずれかを選択どのようにコマンド:システムコマンドを呼び出すさまざまな方法

方法1:

os.system('ls -l *.py') 

方法2:

os.popen("ls -l").read() 

方法3:

subprocess.check_output(["ls", "-l", "*.py"]); 

方法4:

p = subprocess.Popen("ls -l *.py", stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, shell=True) 
(out, err) = p.communicate() 

方法5:

from shell_command import shell_call 
shell_call("ls -l *.py") 

それぞれの相対的な長所と短所は何ですか? python3とpython2には特に推奨されるものがあります。両方のバージョンで動作する方法はありますか?

答えて

1

短い答え:subprocessモジュール

で行くsubprocessからどれでも味は、あなたが(入力、出力、パイプ)必要なものに応じて使用する必要がありますが、os.systemos.popenreplacedするdefinetlyですもう使用しないでください。他の兄弟はsubprocess.callcheck_callのコマンドとコマンドのみの出力を返し、任意の通信を管理しないように

subprocess.check_outputsubprocess.Popenのラッパーです。

subprocess.Popenはベースメソッドであり、これは一方向/双方向およびPIPEリダイレクトのようなより洗練されたプロセス通信を行うために使用されました。

shell_commandは、シェルのやり取りを容易にするパッケージであり、subprocess.Popenに基づいています。あなたがシステム管理の仕事の多くをやっていない場合、それを使用する必要はありません。

どのようにしてsubprocessが必要なのですか?

1)シェルとの対話は不要ですが、FireとForget?

subprocess.callos.systemos.callの直接交換です。あなたはそれを呼び出し、出力を気にしません。コマンドライン引数は、list of stringsまたは単一のstring(シェル= Trueモードのみ)として渡されます。これは、引用符や特殊文字をエスケープする負担から解放されます。

例:あなたは、外部コマンドがクラッシュした場合/知っている成功するか、他のexitコマンド、あなたがそれを処理する必要があるにしたい場合は

subprocess.call(['ls', '-l']) 

戻り値は、アプリケーション自体の終了コードですあなた自身。

1A)あなたがエラー処理に対処するためのpythonをしたい場合は、便利な機能subprocess.check_callsubprocess.callと同じである、利用可能ですが、それはCalledProcessErrorを提起

を自動エラー処理を必要としますプロセスが0以外のエラー値を返す場合は例外です。

try: 
    subprocess.check_call(['false']) 
except subprocess.CalledProcessError as err: 
    print 'Error:', err 

2)外部コマンドの出力でチェック!

subprocess.callsubprocess.check_call親のプログラムの開発の出力にバインドされているので、彼らは、コマンドの出力をキャプチャすることはできません。 subprocess.check_outputは、コマンドの出力をキャプチャするコマンドです。

例:

output = subprocess.check_output(['ls', '-l']) 
print output 

total 941234 
drwxr-xr-x 28 user staff   1972 Dec 9 11:24 test.cpp 
-rw-r--r--  1 user staff   799 Jan 1 09:12 out 

3)あなたのプロセスと通信?まだ書い

... POPEN程度になるだろう。.. :)

+0

非常に良い説明してくれてありがとう。残りの部分を楽しみにしています。また、これらのメソッドのどれがpython2またはpython3に特有のものですか? – rnso

関連する問題