我正在尝试从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运行时(以某种方式)丢失了该信息?还有什么可能导致这种情况?

最佳答案

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

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


你需要这个:

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


正如您在注释中提到的,将第二个参数拆分为“ =”只会使squeue混乱,然后将看到两个参数。

10-08 02:29