2016-12-19 24 views
0

我試圖從python腳本調用SLURM squeue。該命令,SLURM squeue格式參數在子進程中失敗.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 = username,jobid,name,timeleft」]' –

回答

2

subprocess.Popen的第一個參數是一個字符串或一個字符串列表。如果它是一個字符串,它將被解釋爲一個文件名。這是你得到錯誤的原因。 要傳遞一個字符串列表,它應該匹配shell如何將參數傳遞給進程。一個標準的外殼會分裂以空白的命令行,所以不是這樣的:

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

你需要這樣的:

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

分裂的第二個參數在「=」當你在你的評論中提及剛混淆squeue,然後會看到兩個參數。