【问题标题】:How do I execute multiple shell commands with a single python subprocess call?如何使用单个 python 子进程调用执行多个 shell 命令?
【发布时间】:2016-09-27 12:47:25
【问题描述】:

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

【问题讨论】:

  • 您能否提供一个典型示例来说明您希望执行的命令类型?
  • 您可以使用&/;/&& 将命令链接在一起吗?为什么要调用单个子流程 - 为什么不使用循环来提供更多控制权,例如提前终止?
  • 使用; 将它们按顺序排列:subprocess.call("do_A ; do_B ; do_C ; ", shell=True)。以编程方式:call(' ; '.join(commands), shell=True)
  • 任何典型的shell命令都可以,比如ls可能,我不需要使用一个命令输出作为下一个输入,所有命令都是独立的。
  • 另一种选择:只需启动一个 shell 并将命令作为输入发送:p = call("bash", stdin=PIPE); p.communicate("\n".join(commands))

标签: python subprocess


【解决方案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 并循环您的几个命令。据我所知,没有办法直接用子进程模块启动多个子进程。

【讨论】:

  • 某些东西必须遍历命令列表。 shell可以做到这一点。 python可以做到这一点。
  • @Skaperen 完全正确。只是,如果 Python 执行循环和 exec() 系统调用,我会认为它更纯粹,正如 OP 所希望的那样。