在shell中,如果我只想在第一个命令成功时执行第二个命令,我会这样做
cmd1 && cmd2
如果我需要执行第二个命令,如果第一个命令失败,我会这样做
cmd1 || cmd2
我在python脚本中通过subprocess.call调用命令列表。我怎么能做到这一点?
答案 0 :(得分:5)
将shell=True
传递给subprocess.call
,您可以执行任意shell命令。请确保escape/quote everything correctly。
subprocess.call("true && echo yes!", shell=True)
打印yes!
,而
subprocess.call("false && echo yes!", shell=True)
什么都不打印。
(您无需转义或引用&&
或||
,但其中包含空格的文件名可能会很痛苦。)
答案 1 :(得分: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.
答案 2 :(得分:1)
扩展@larsmans回答 - 如果您使用的是subprocess.call
,并且由于某种原因不想设置shell=True
,则可以检查returncode
属性。
如果返回码为0,则命令成功。您还可以实施subprocess.check_call
来筹集CalledProcessError
。这是一些有用的documentation