问题描述
如何在子进程中运行多个命令?我想做的是使用子进程模块执行与下面的csh脚本等效的操作。
import subprocess
subprocess.run(['source run.csh'],shell=True,executable='/bin/csh')
作为一个中间步骤,我尝试从python运行脚本。
with subprocess.Popen(...,executable='/bin/csh') as proc:
proc.communicate('setenv VARIABLE value')
proc.communicate('source /folder/license_setup.rc')
proc.communicate('command -flag0 -arg0a -flag1 -arg1a')
proc.communicate('command -flag0 -arg0b -flag1 -arg1b')
proc.communicate('command -flag0 -arg0c -flag1 -arg1c')
这工作正常,但是还不是我想要的。我看了一些示例,我认为我需要使用Popen并进行通信,但无法弄清楚该怎么做。我在下面编写了一个简单的伪实现。有人有建议吗?
import subprocess
subprocess.run(['source runa.csh'],executable='/bin/csh')
subprocess.run(['source runb.csh'],executable='/bin/csh')
subprocess.run(['source runc.csh'],executable='/bin/csh')
作为替代方案,我还可以生成多个csh脚本并分别运行它们。但是创建一堆csh脚本并调用所有这些脚本似乎有点愚蠢,而不是用python编写脚本。
{{1}}
(btw:我想使用单独的调用的原因是为了监视tqdm的进度。为了使示例简短,我没有包括tqdm语句。)
解决方法
这是我使用要执行的命令列表的解决方案:
from subprocess import Popen
commands = [
'setenv VARIABLE value','source /folder/license_setup.rc','command -flag0 -arg0a -flag1 -arg1a','command -flag0 -arg0b -flag1 -arg1b','command -flag0 -arg0c -flag1 -arg1c'
]
procs = [ Popen(i,shell=True,executable='/bin/csh') for i in commands ]
for p in procs:
p.wait()