我必须编写一个python脚本来使用qsub(SGE)提交作业。
我想要执行的命令是以下形式:
qsub -b y / usr / bin / L2prod filein fileout
其中L2prod是一个已编译的程序(二进制文件,这是-b y选项的原因),filein / fileout只是带有输入/输出文件名称的字符串。如果我打开一个shell并输入上一行,一切顺利。
在我的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:execution:qsub -b y / usr / bin / L2prod /data/L1/20180414-222503_L1.txt/data/L2/20180414-222503_L2.txt
看日志似乎命令行是正确的,但我收到以下错误:
qsub:二进制作业所需的命令
并且没有提交任何工作。
似乎在.Popen()方法中忽略了“-b y”选项。我究竟做错了什么?我认为shell = True选项会解决这个问题。
您必须将每个标志作为列表的单独字符串元素提供。第一行是不同的。
# 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