我需要从Python运行很多bash命令。目前我正在用这个做这件事 subprocess.Popen(cmd,shell = True)
有没有解决办法在同一个shell中运行所有这些命令? subprocess.Popen在每次执行时打开一个新shell,我需要在每次调用时设置所有必需的变量,以便cmd命令正常工作。
答案 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了解如何在父流程中一劳永逸地设置环境变量。