シェルでは、最初のコマンドが成功した場合にのみ2番目のコマンドを実行したい場合、これを行います
cmd1 && cmd2
そして、最初のコマンドが失敗した場合に2番目のコマンドを実行する必要がある場合は、これを行います
cmd1 || cmd2
Pythonスクリプトでsubprocess.callを介してコマンドのリストを呼び出しています。どうすれば上記を行うことができますか?
に渡すshell=True
とsubprocess.call
、任意のシェル コマンドを実行できます。すべてを正しくエスケープ/引用するようにしてください。
subprocess.call("true && echo yes!", shell=True)
プリントyes!
しながら
subprocess.call("false && echo yes!", shell=True)
何も印刷しません。
&&
(またはをエスケープまたは引用する必要はありませんが||
、ファイル名にスペースが含まれていると面倒な場合があります。)
@larsmans の回答の拡張 - 使用していて何らかの理由でsubprocess.call
設定したくない場合は、属性を確認できます。
戻りコードが 0 の場合、コマンドは成功しています。a を実装して aを上げることもできます。ここにいくつかの役立つドキュメントがありますshell=True
returncode
subprocess.check_call
CalledProcessError
この種の何かが機能します
In [227]: subprocess.Popen(['dir', '||', 'ls'], shell=True)
Out[227]: <subprocess.Popen at 0x1e4dfb0>
Volume in drive D has no label.
Volume Serial Number is 4D5A-03B6
Directory of D:\Dummy
09/14/2012 03:54 PM <DIR> .
09/14/2012 03:54 PM <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 141,482,524,672 bytes free
In [228]: subprocess.Popen(['dir', '&&', 'ls'], shell=True)
Out[228]: <subprocess.Popen at 0x1e4df10>
Volume in drive D has no label.
Volume Serial Number is 4D5A-03B6
Directory of D:\Dummy
09/14/2012 03:54 PM <DIR> .
09/14/2012 03:54 PM <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 141,482,524,672 bytes free
'ls' is not recognized as an internal or external command,
operable program or batch file.