2016-12-19 8 views
0

Я пытаюсь вызвать SLURM squeue из сценария python. Команда,Ошибка аргумента формата squeue SLURM из подпроцесса. Popen

/usr/bin/squeue --Format=username,jobid,name,timeleft

прекрасно работает из командной строки, но терпит неудачу из subprocess.Popen с:

p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    File "/n/home00/DilithiumMatrix/.conda/envs/py35/lib/python3.5/subprocess.py", line 947, in __init__ 
    restore_signals, start_new_session) 
    File "/n/home00/DilithiumMatrix/.conda/envs/py35/lib/python3.5/subprocess.py", line 1551, in _execute_child 
    raise child_exception_type(errno_num, err_msg) 
FileNotFoundError: [Errno 2] No such file or directory: '/usr/bin/squeue --Format=username,jobid,name,timeleft' 

MWE:

import subprocess 
command = "/usr/bin/squeue --Format=username,jobid,name,timeleft" 
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
text = p.stdout.read() 
print(text) 

/usr/bin/squeue прекрасно работает как из командной строки или Popen.

Может ли он быть неудачным, поскольку он требует некоторой информации о пользователе/​​группе, выполняющей команду squeue, и которая (как-то) потеряна при запуске через python? Что еще может быть причиной этого?

+1

Как выглядит ваш вызов 'subprocess.Popen'? Как это происходит? –

+0

@MarkkuK. woops, извините --- MWE и сообщение об ошибке включены. – DilithiumMatrix

+0

Вам необходимо передать команду в виде списка строк: 'command = ["/usr/bin/squeue "," --Format = имя пользователя, jobid, name, timeleft "]' –

ответ

2

Первый аргумент subprocess.Popen является либо строкой, либо списком строк. Если это одна строка, она будет интерпретироваться как имя файла. Это является причиной ошибки, которую вы получаете. Чтобы передать список строк, он должен соответствовать тому, как оболочка передаст ваши аргументы процессу. Стандартная оболочка будет разделить вашу командную строку пробелами, так что вместо этого:

command = "/usr/bin/squeue --Format=username,jobid,name,timeleft" 

вам это нужно:

command = ["/usr/bin/squeue", "--Format=username,jobid,name,timeleft"] 

расщеплению второй аргумент в «=», как вы упомянули в своем комментарии просто смущает, что будет видно два аргумента.