#python #popen #qsub
#python #popen #qsub
Вопрос:
Я должен написать скрипт на python для отправки заданий с помощью qsub (SGE).
Команда, которую я хочу выполнить, имеет вид:
qsub -файл b y /usr/bin/L2prod в файле вывода
где 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.
и вывод в файле журнала является:
ИНФОРМАЦИЯ:job_submit:выполнение: qsub -b y /usr/bin/L2prod /data/L1/20180414-222503_L1.txt /data/L2/20180414-222503_L2.txt
Просматривая журнал, кажется, что командная строка верна, но я получил следующую ошибку:
qsub: команда, необходимая для двоичного задания
и ни одно задание не было отправлено.
Похоже, что опция «-b y» была проигнорирована внутри .Метод Popen(). Что я делаю не так? Я думал, что опция shell = True исправила бы это.
Комментарии:
1. Попробуйте
args=['qsub', '-b', 'y ', L2prod, filein, fileout]
2. Это работает! Большое вам спасибо!
3. Круто, я опубликовал то же самое в качестве ответа, чтобы другим было легче это увидеть.
Ответ №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
Комментарии:
1. Как я уже сказал, это работает, спасибо! Но, чтобы быть точным, правильный вариант для моего случая: shell= False
2. @fool Спасибо. Я изменил свой ответ и добавил соответствующую ссылку.