2016-09-27 98 views
2

理想情况下,它应该像我想要使用单个子进程调用执行所有这些命令的命令列表。我可以通过将所有命令存储为shell脚本并使用子进程调用该脚本来做类似的事情,但我需要一个纯粹的python解决方案。我将使用shell = True执行命令,并且我了解风险。如何用一个python子进程调用执行多个shell命令?

+0

你能提供一个典型的你想要执行的命令类型的例子吗? – idjaw

+0

您可以使用'&'/';'/'&&'将这些命令链接在一起吗?为什么只有一个子进程调用 - 为什么不循环会给你更多的控制权,例如,提前终止? – ryachza

+2

使用';'按顺序放置它们:'subprocess.call(“do_A; do_B; do_C;”,shell = True)'。以编程方式:'call(';'.join(commands),shell = True)' – Bakuriu

回答

1

如果它们是独立的,使用分号链接它们。

例如,(Python 3中)

>>> import subprocess 
>>> result = subprocess.run('echo Hello ; echo World', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
>>> result 
CompletedProcess(args='echo Hello ; echo World', returncode=0, stdout=b'Hello\nWorld\n') 

但在技术上,这不是一个纯Python溶液,因为shell=True。 arg处理实际上是由shell完成的。 (你可能会认为它是执行/bin/sh -c "$your_arguments"

如果你想要一个更纯粹的解决方案,你必须使用shell=False并循环你的几个命令。据我所知,没有办法直接用子流程模块启动多个子流程。

+1

必须通过命令列表循环。一个外壳可以做到这一点。 python可以做到这一点。 – Skaperen

+0

@Skaperen正好。只是,如果Python执行循环和'exec()'系统调用,我会认为它更纯粹,因为OP需要。 –