在 shell 中,如果我只想在第一个命令成功的情况下执行第二个命令,我会这样做
cmd1 && cmd2
如果第一个命令失败,我需要执行第二个命令,我会这样做
cmd1 || cmd2
我在 python 脚本中通过 subprocess.call 调用命令列表。我该怎么做以上?
传递shell=True
给subprocess.call
您可以执行任意 shell 命令。只要确保您正确地转义/引用所有内容即可。
subprocess.call("true && echo yes!", shell=True)
打印yes!
,而
subprocess.call("false && echo yes!", shell=True)
什么都不打印。
(您不需要转义或引用&&
or ||
,但是其中带有空格的文件名可能会很痛苦。)
扩展@larsmans 答案 - 如果您正在使用subprocess.call
并且不想shell=True
出于任何原因进行设置,您可以检查returncode
属性。
如果返回码为 0,则命令成功。您还可以实现 asubprocess.check_call
来提高 a 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.