1

シェルでは、最初のコマンドが成功した場合にのみ2番目のコマンドを実行したい場合、これを行います

cmd1 && cmd2

そして、最初のコマンドが失敗した場合に2番目のコマンドを実行する必要がある場合は、これを行います

cmd1 || cmd2

Pythonスクリプトでsubprocess.callを介してコマンドのリストを呼び出しています。どうすれば上記を行うことができますか?

4

3 に答える 3

7

に渡すshell=Truesubprocess.call、任意のシェル コマンドを実行できます。すべてを正しくエスケープ/引用するようにしてください。

subprocess.call("true && echo yes!", shell=True)

プリントyes!しながら

subprocess.call("false && echo yes!", shell=True)

何も印刷しません。

&&(またはをエスケープまたは引用する必要はありませんが||、ファイル名にスペースが含まれていると面倒な場合があります。)

于 2012-09-14T10:23:44.017 に答える
3

@larsmans の回答の拡張 - 使用していて何らかの理由でsubprocess.call設定したくない場合は、属性を確認できます。 戻りコードが 0 の場合、コマンドは成功しています。a を実装して aを上げることもできます。ここにいくつかの役立つドキュメントがありますshell=Truereturncode
subprocess.check_callCalledProcessError

于 2012-09-14T10:36:03.870 に答える
1

この種の何かが機能します

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.
于 2012-09-14T10:26:21.127 に答える