短い答え:subprocessモジュール
で行くsubprocess
からどれでも味は、あなたが(入力、出力、パイプ)必要なものに応じて使用する必要がありますが、os.system
とos.popen
はreplacedするdefinetlyですもう使用しないでください。他の兄弟はsubprocess.call
とcheck_call
のコマンドとコマンドのみの出力を返し、任意の通信を管理しないように
subprocess.check_output
はsubprocess.Popen
のラッパーです。
subprocess.Popen
はベースメソッドであり、これは一方向/双方向およびPIPEリダイレクトのようなより洗練されたプロセス通信を行うために使用されました。
shell_command
は、シェルのやり取りを容易にするパッケージであり、subprocess.Popen
に基づいています。あなたがシステム管理の仕事の多くをやっていない場合、それを使用する必要はありません。
どのようにしてsubprocess
が必要なのですか?
1)シェルとの対話は不要ですが、FireとForget?
subprocess.call
os.system
とos.call
の直接交換です。あなたはそれを呼び出し、出力を気にしません。コマンドライン引数は、list of strings
または単一のstring
(シェル= Trueモードのみ)として渡されます。これは、引用符や特殊文字をエスケープする負担から解放されます。
例:あなたは、外部コマンドがクラッシュした場合/知っている成功するか、他のexitコマンド、あなたがそれを処理する必要があるにしたい場合は
subprocess.call(['ls', '-l'])
戻り値は、アプリケーション自体の終了コードですあなた自身。
1A)あなたがエラー処理に対処するためのpythonをしたい場合は、便利な機能subprocess.check_call
がsubprocess.call
と同じである、利用可能ですが、それはCalledProcessError
を提起
を自動エラー処理を必要としますプロセスが0
以外のエラー値を返す場合は例外です。
try:
subprocess.check_call(['false'])
except subprocess.CalledProcessError as err:
print 'Error:', err
2)外部コマンドの出力でチェック!
subprocess.call
とsubprocess.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程度になるだろう。.. :)
非常に良い説明してくれてありがとう。残りの部分を楽しみにしています。また、これらのメソッドのどれがpython2またはpython3に特有のものですか? – rnso