9

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

最初,我尝试使用 subprocess 模块,但出现错误:#!/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

然后我注释掉了 subprocess 行并使用了 os 并且它立即工作。我想我没有完全理解 subprocess 模块

#!/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)

上面的代码完美无缺。我只是想知道子流程模块的原因和优势是什么。另外,我使用的是 unix shell

4

3 回答 3

3

您想在 Popen 通话中使用 shell=True 。

p=sp.Popen(['qdel %d'%i], shell=True, stdout=sp.PIPE)
于 2012-06-21T16:25:46.657 回答
3

如果你阅读手册,你会发现你的调用Popen是错误的:你不应该传递一个命令,而应该传递一个参数数组:

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

或者,正如sc0tt 的回答指出的那样,您可以使用shell=True,但这在更复杂的情况下有一些缺点:您必须手动转义命令中的所有变量数据,以防它包含例如带空格的文件名或更多潜在有害(如;

于 2012-06-21T16:33:56.893 回答
0

我也遇到了同样的问题。使用 shell=True 作为参数之一解决了我的问题。

于 2018-08-20T12:21:38.260 回答