python - Python,使用 Popen 提交 qsub 作业
问题描述
我必须编写一个 python 脚本来使用 qsub (SGE) 提交作业。
我要执行的命令格式如下:
qsub -by /usr/bin/L2prod filein fileout
其中 L2prod 是已编译的程序(二进制文件,这是 -by 选项的原因),而 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:executing: qsub -by /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
推荐阅读
- pyspark - Pyspark 中的模型概率校准
- reactjs - 如何使用模块为作为表达式的类设置样式
- php - 从产品 WooCommerce 运输类别 ID 中获取标签名称
- python - NoReverseMatch at / Reverse for 'user_login' 未找到。'user_login' 不是有效的视图函数或模式名称
- android - Firebase Analytics 事件属性未显示,但确实出现在 DebugView 中
- android - 我在所有活动和mainfest中的“this.something”中出现错误,android studio的xml
- python - Discord.py 如何测试成员是否在角色字典中具有特定角色?
- amazon-web-services - 使用 docker-compose 在本地挂载 AWS EFS
- python - 制作一个新的 pandas 数据框,其中包含时间序列中每个 id 的值的列
- c# - 使用 c# 合并/连接两个视频