我想從q中刪除一些作業。刪除作業的命令是qdel JOBid
。爲什麼這個命令與os.system()一起工作,但不是subprocess.Popen()?
起初,我試圖用的子模塊,但我得到了一個錯誤: #在/ usr /斌/包膜蟒蛇
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
然後我註釋了子進程行和使用os,它立即工作。我想我不完全瞭解子流程模塊
#!/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
雖然你仍然需要使用'shell = True'嗎?如果你沒有指定'shell = True',Popen不希望參數列表中的第一項是要執行的程序的路徑? – smont
@ sc0tt從[execvp]的手冊頁(http://linux.die.net/man/3/execv):函數'execlp()'和'execvp()'將複製如果指定的文件名不包含斜槓(/)字符,則搜索可執行文件。 – aland
@ sc0tt我已經測試了他的答案,它工作。 – ironcyclone