1

在 shell 中,如果我只想在第一个命令成功的情况下执行第二个命令,我会这样做

cmd1 && cmd2

如果第一个命令失败,我需要执行第二个命令,我会这样做

cmd1 || cmd2

我在 python 脚本中通过 subprocess.call 调用命令列表。我该怎么做以上?

4

3 回答 3

7

传递shell=Truesubprocess.call您可以执行任意 shell 命令。只要确保您正确地转义/引用所有内容即可

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

打印yes!,而

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

什么都不打印。

(您不需要转义或引用&&or ||,但是其中带有空格的文件名可能会很痛苦。)

于 2012-09-14T10:23:44.017 回答
3

扩展@larsmans 答案 - 如果您正在使用subprocess.call并且不想shell=True出于任何原因进行设置,您可以检查returncode属性。
如果返回码为 0,则命令成功。您还可以实现 asubprocess.check_call来提高 a CalledProcessError。这里有一些有用的文档

于 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 回答