如何使用单个Python subprocess函数调用执行多个shell命令?

9

理想情况下,它应该像我想要执行的命令列表,而且我希望使用单个子进程调用来执行所有命令。我能够通过将所有命令存储为shell脚本并使用subprocess调用该脚本来实现类似的功能,但我想要一个纯Python解决方案。我将使用shell=True执行这些命令,并理解其中的风险。


你能提供一种典型的命令示例,以便我们了解你想要执行的类型吗? - idjaw
你可以使用 &/;/&& 来链接这些命令吗?为什么只用单个子进程调用呢 - 为什么不使用循环,这样可以更好地控制,例如提前终止? - ryachza
2
使用分号 ; 将它们按顺序连接起来:subprocess.call("do_A ; do_B ; do_C ; ", shell=True)。以编程方式实现:call(' ; '.join(commands), shell=True) - Bakuriu
2
另一种方法是:只需启动一个 shell 并将命令作为输入发送:p = call("bash", stdin=PIPE); p.communicate("\n".join(commands)) - Bakuriu
@Bakuriu 当我尝试使用subprocess启动shell,然后使用管道通信命令时,进程会挂起,而执行p.close()也无济于事。 - Shuvro Bhattacharya
显示剩余2条评论
1个回答

8
使用分号将它们链接起来,如果它们是独立的。例如,(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。实际上,参数处理是由shell完成的。(您可以将其视为执行/bin/sh -c“$your_arguments”

如果您想要一个更加纯净的解决方案,您需要使用shell=False并循环处理多个命令。据我所知,没有直接使用subprocess模块启动多个子进程的方法。


2
有些东西必须循环遍历命令列表。Shell 可以做到这一点。Python 也可以做到这一点。 - Skaperen
@Skaperen 没错。只是,如果Python执行循环和exec()系统调用,我会认为它更加纯粹,就像OP想要的那样。 - Pavel Gurkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接