我必须编写一个python脚本才能使用qsub(SGE)提交作业。
我要执行的命令的格式为:
qsub -b y / usr / bin / L2prod filein fileout
其中L2prod是已编译程序(二进制文件,这是-b y选项的原因),而filein / fileout只是具有输入/输出文件名的字符串。 如果我打开一个外壳并输入上一行,一切都会顺利进行。
在我的python程序中,我有:
...
args=['qsub -b y ', L2prod, filein, fileout]
log.info('executing: '+' '.join(map(str,args)))
process=subprocess.Popen(args,shell=True)
...
etc.
,日志文件中的输出为:
INFO:job_submit:执行中:qsub -b y / usr / bin / L2prod /data/L1/20180414-222503_L1.txt /data/L2/20180414-222503_L2.txt
查看日志,似乎命令行是正确的,但是出现以下错误:
qsub:二进制作业所需的命令
没有作业提交。
.Popen()方法中似乎忽略了“ -b y”选项。我究竟做错了什么?我以为shell = True选项可以解决此问题。
答案 0 :(得分:1)
您必须提供每个标志作为列表的单独字符串元素。第一行是不同的。
# args=['qsub -b y ', L2prod, filein, fileout]
args=['qsub', '-b', 'y', L2prod, filein, fileout]
log.info('executing: '+' '.join(map(str,args)))
process=subprocess.Popen(args,shell=False)
为什么要避免使用shell = True
参数。
https://medium.com/python-pandemonium/a-trap-of-shell-true-in-the-subprocess-module-6db7fc66cdfd