Python 为什么此命令可以与os.system()一起使用,而不能与SUBSPROCESS.Popen()一起使用?

Python 为什么此命令可以与os.system()一起使用,而不能与SUBSPROCESS.Popen()一起使用?,python,subprocess,Python,Subprocess,我想从q中删除一些作业。删除作业的命令是qdel JOBid 最初,我尝试使用子流程模块,但出现了一个错误: #!/usr/bin/env python import sys, os, subprocess as sp lo = sys.argv[1] hi = sys.argv[2] lo = int(lo) hi = int(hi) for i in range(lo,hi): print "i is %d"%i p=sp.Popen(['qdel %d'%

我想从q中删除一些作业。删除作业的命令是
qdel JOBid

最初,我尝试使用子流程模块,但出现了一个错误: #!/usr/bin/env python

 import sys, os, subprocess as sp

 lo = sys.argv[1]
 hi = sys.argv[2]

 lo = int(lo)
 hi = int(hi)


for i in range(lo,hi):
    print "i is %d"%i
    p=sp.Popen(['qdel %d'%i],stdout=sp.PIPE)
    #os.system('qdel %d'%i)
所以这不起作用。我犯的错误是

Traceback (most recent call last):
File "del.py", line 14, in <module>
p=sp.Popen(['qdel %d'%i],stdout=sp.PIPE)
File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__
errread, errwrite)
File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

上面的代码工作得非常完美。我只是想知道为什么以及子流程模块的优点是什么。另外,我使用的是unix shell

您希望在Popen调用中使用shell=True

p=sp.Popen(['qdel %d'%i], shell=True, stdout=sp.PIPE)
如果阅读,您会发现对
Popen
的调用是错误的:您不应该传递单个命令,而应该传递一个参数数组:

p=sp.Popen(['qdel', '%d'%i],stdout=sp.PIPE)

或者,正如所指出的,您可以使用
shell=True
,但在更复杂的情况下,这有一些缺点:如果命令中包含,例如,带有空格的文件名或任何可能更有害的内容(如
),则必须手动转义命令中的所有变量数据我也收到了同样的问题。使用shell=True作为参数之一解决了我的问题。

因此,如果shell为false,那么它尝试在哪里执行命令?@Chris2021 With
shell=false
,它只运行进程。使用
shell=True
,它将调用默认shell并使其执行提供的字符串。但是,您是否仍然需要使用
shell=True
?如果不指定
shell=True
参数列表中的第一项不是要执行的程序路径吗?@sc0tt来源:函数
execlp()
execvp()如果指定的文件名不包含斜杠(/)字符,则
将复制shell在搜索可执行文件时的操作。
p=sp.Popen(['qdel', '%d'%i],stdout=sp.PIPE)