SLURM squeue格式参数从subprocess.Popen失败

时间:2016-12-19 21:30:15

标签: python command-line subprocess jobs slurm

我正试图从python脚本中调用SLURM squeue。命令,

/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 个答案:

答案 0 :(得分:2)

subprocess.Popen的第一个参数是字符串或字符串列表。如果它是单个String,则将其解释为文件名。这就是你得到错误的原因。 要传递字符串列表,它应该匹配shell将参数传递给进程的方式。标准shell将按空格分割命令行,因此不是:

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

你需要这个:

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

在" ="分割第二个参数。正如你在评论中提到的那样,只会混淆squeue,然后会看到两个参数。