Python, использующий Popen для отправки заданий qsub

#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 Спасибо. Я изменил свой ответ и добавил соответствующую ссылку.