2017-02-09 81 views
1

我想从python脚本分配任务给qsub。Python:与子进程回显

为的qsub提交到目前为止,我一直用这样的表达:

echo "python script.py arg1 arg2" | qsub 

我想在python重现此命令:

command = 'echo "python sub_master_script.py ' + str(i) + ' ' + path + '" | qsub -pe make 5 -N Teaching_' + str(i) + ' -cwd' 
subprocess.call(shlex.split(command)) 

虽然command带有命令我通常会使用,当我启动python脚本时,它被解释为一个简单的echo

,而不是开始一个新的工作,我得到这个写在控制台:

python sub_master_script.py 0.75 /data5/bio/runs-galkin/Iterative/test_OTU.txt | qsub -pe make 5 -N Teaching_0.75 -cwd 

为什么出现这种情况?我怎样才能使它工作?

回答

2

您正在大量使用shell功能,主要是通过运行2个进程连接在一起。

subprocess.call(shlex.split(command),shell=True) 

是一个quickfix。

这样做是使用1 subprocess.Popen例如,通过communicate提供输入的正确方法(模拟echo python ...)和shell=True(使用pipes.quote查尔斯评论,以确保在需要时字符串被正确引用)下降

import pipes 
input_string = "python sub_master_script.py {} {}\n".format(*(map(pipes.quote,[str(i),path]))) 

p = subprocess.Popen(['qsub','-pe','make','5','-N','Teaching_{}'.format(i),'-cwd'],stdin=subprocess.PIPE) 
out,err = p.communicate(input_string) 
+0

这里假设'i'和'path'是不需要引用/转义的字符串。使用'pipes.quote()'来准备它们的值会更安全(虽然,被授予,OP的原始shell命令是完全相同的方式是不安全的/ bug)。 –

+0

@CharlesDuffy很好的附加组件。编辑。 –

+0

我试着用你的解决方案,我得到'TypeError:__init __()有一个意想不到的关键字参数'input'' 使用'subprocess.Popen(command,shell = True,stdout = subprocess.PIPE,stderr = subprocess.STDOUT)'工作正常。我没有看到'shell = True'出了什么问题,所以我想我会离开它 – lotrus28