使用Python中的子进程防止创建新的子进程

时间:2014-09-15 18:42:40

标签: python bash subprocess parent-child popen

我需要从Python运行很多bash命令。目前我正在用这个做这件事     subprocess.Popen(cmd,shell = True)

有没有解决办法在同一个shell中运行所有这些命令? subprocess.Popen在每次执行时打开一个新shell,我需要在每次调用时设置所有必需的变量,以便cmd命令正常工作。

3 个答案:

答案 0 :(得分:2)

subprocess.Popen允许您提供环境变量字典,它将成为正在运行的进程的环境。如果您需要shell=True的唯一原因是设置环境变量,那么我建议您使用显式环境字典;它更安全,也不是特别困难。此外,当您不必担心引用和shell元字符时,构建命令调用通常要容易得多。

如果您不介意在运行过程中设置环境变量,则甚至可能不需要构造环境字典。 (大多数情况下,这不会是一个问题,但有时也是如此。我对你的应用程序的了解不够了。)

如果您可以使用这些设置修改自己的环境,请执行以下操作:

os.environ['theEnvVar'] = '/the/value' 

然后你可以使用一个简单的Popen.call(或类似的)来运行命令:

output = subprocess.check_output(["ls", "-lR", "/tmp"])

如果由于某种原因您无法更改自己的环境,则需要复制当前环境,根据需要进行修改,并将其传递给每个subprocess.call

env = os.environ.copy()
env['theEnvVar'] = '/the/value'
output = subprocess.check_output(["ls", "-lR", "/tmp"], env=env)

如果您不想每次都指定env=env,只需编写一个小包装类。

答案 1 :(得分:1)

为什么不创建一个包含运行所需命令的shell脚本,然后只使用一个subprocess.Popen()调用来运行它?如果您需要运行的命令内容取决于Python脚本中计算的结果,您可以动态创建shell脚本,然后运行它。

答案 2 :(得分:-2)

使用multiprocessing代替,它更轻巧,更高效。

与subprocess.Popen不同,它不会在每次执行时打开一个新的shell。

您没有说需要来运行subprocess.Popen而您可能不需要;你刚才说的就是你现在正在做的事情。请更多理由。

请参阅set env var in Python multiprocessing.Process了解如何在父流程中一劳永逸地设置环境变量。