如何使用子流程模块将csh脚本转换为python



如何使用子流程运行多个命令?我想做的是使用子流程模块来完成下面csh脚本的等效工作。

#!/bin/csh
setenv VARIABLE value
source /folder/license_setup.rc
command -flag0 -arg0a -flag1 -arg1a
command -flag0 -arg0b -flag1 -arg1b
command -flag0 -arg0c -flag1 -arg1c

作为中间步骤,我尝试从python运行脚本。

import subprocess
subprocess.run(['source run.csh'], shell=True, executable='/bin/csh')

这工作不错,但还不是我想要的。我看了一些例子,我认为我需要使用Popen和交流,但不知道如何使用。我在下面写了一个天真的伪实现。有人有什么建议吗?

with subprocess.Popen(..., shell=True, 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')

作为替代方案,我还可以生成多个csh脚本并分别运行它们。但是,创建一堆csh脚本并调用所有这些脚本似乎有点傻,而不是用python编写脚本。

import subprocess
subprocess.run(['source runa.csh'], shell=True, executable='/bin/csh')
subprocess.run(['source runb.csh'], shell=True, executable='/bin/csh')
subprocess.run(['source runc.csh'], shell=True, executable='/bin/csh')

(顺便说一句:我想使用单独调用的原因是用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()

最新更新