2012-06-21 4 views
5

मैं एक क्यू से कई नौकरियों को हटाना चाहता हूं। नौकरी हटाने के लिए आदेश qdel JOBid है। तो यह काम नहीं किया #/usr/bin/env अजगरयह आदेश os.system() के साथ क्यों काम करता है लेकिन subprocess.Popen() नहीं?

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 

फिर मैंने उपप्रोसेस लाइन पर टिप्पणी की और ओएस का उपयोग किया और यह तुरंत काम किया। मुझे लगता है कि मैं सबप्रोसेस मॉड्यूल

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

उपरोक्त कोड बेकार ढंग से काम करता है। मैं सिर्फ यह जानना चाहता हूं कि सबप्रोसेस मॉड्यूल के फायदे क्यों और क्या हैं। इसके अलावा, मैं एक यूनिक्स खोल

उत्तर

3

यदि आप manual पढ़ा है, आप देख सकते हैं कि Popen करने के लिए अपने कॉल गलत है: आप एक ही आदेश नहीं पारित करना चाहिए, लेकिन तर्क की एक सरणी:

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

वैकल्पिक रूप से, के रूप में sc0tt's answer अंक बाहर , आप shell=True का उपयोग कर सकते हैं, लेकिन इसमें अधिक जटिल मामलों में कुछ नुकसान हैं: यदि आप इसमें शामिल हैं, तो आपको कमांड में सभी वैरिएबल डेटा मैन्युअल रूप से बचाना होगा, उदाहरण के लिए, रिक्त स्थान के साथ फ़ाइल नाम या कुछ भी संभावित रूप से हानिकारक (जैसे ;)

+0

क्या आपको अभी भी 'shell = True' का उपयोग करने की आवश्यकता नहीं होगी? यदि आप 'shell = True' निर्दिष्ट नहीं करते हैं तो तर्कों की सूची में पहला आइटम निष्पादित करने के लिए प्रोग्राम का पथ होने की उम्मीद नहीं है? – smont

+1

@ sc0tt से [execvp' के लिए मैन-पेज] (http://linux.die.net/man/3/execv): फ़ंक्शन 'execlp()' और 'execvp()' के कार्यों को डुप्लिकेट करेगा एक निष्पादन योग्य फ़ाइल की खोज में खोल अगर निर्दिष्ट फ़ाइल नाम में स्लैश (/) वर्ण नहीं है। – aland

+0

@ sc0tt मैंने अपने उत्तर का परीक्षण किया है और यह काम किया है। – ironcyclone

2

का उपयोग कर रहा हूं, आप अपने पॉपन कॉल पर shell = True का उपयोग करना चाहते हैं।

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

तो यदि खोल गलत था, तो यह आदेश निष्पादित करने का प्रयास कहां था? – ironcyclone

+0

@ क्रिस 2021 'खोल = गलत' के साथ, यह केवल ['os.execvp()'] (http://docs.python.org/library/os.html#os.execvp) के साथ प्रक्रिया चलाता है। 'खोल = सही' के साथ, यह आपके डिफ़ॉल्ट खोल को आमंत्रित करता है और इसे आपूर्ति की गई स्ट्रिंग निष्पादित करता है। – aland

+0

@aland धन्यवाद। – ironcyclone