2012-06-21 70 views
5

我想從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

回答

3

如果你讀manual,你可以看到你到Popen電話是錯誤的:你應該通過不是一個單一的命令,但參數數組:

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

此外,作爲sc0tt's answer指出,您可以使用shell=True,但這在更復雜的情況下會有一些缺點:您必須手動轉義命令中的所有變量數據,以防含有空格或更具潛在危害的文件名(如;

+0

雖然你仍然需要使用'shell = True'嗎?如果你沒有指定'shell = True',Popen不希望參數列表中的第一項是要執行的程序的路徑? – smont

+1

@ sc0tt從[execvp]的手冊頁(http://linux.die.net/man/3/execv):函數'execlp()'和'execvp()'將複製如果指定的文件名不包含斜槓(/)字符,則搜索可執行文件。 – aland

+0

@ sc0tt我已經測試了他的答案,它工作。 – ironcyclone

2

你想在你的Popen調用中使用shell = True。

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

因此,如果shell爲false,那麼它試圖執行命令的位置是什麼? – ironcyclone

+0

@ Chris2021使用'shell = False',它只運行['os.execvp()'](http://docs.python.org/library/os.html#os.execvp)的過程。使用'shell = True',它會調用默認的shell並使其執行提供的字符串。 – aland

+0

@aland謝謝。 – ironcyclone

相關問題