2011-10-06 16 views
126

मैं पाइथन से एक बाहरी कार्यक्रम को कॉल करना चाहता हूं। मैंने ऐसा करने के लिए Popen() और call() दोनों का उपयोग किया है।सबप्रोसेस पॉपन और कॉल (मैं उनका उपयोग कैसे कर सकता हूं) के बीच क्या अंतर है?

दोनों के बीच क्या अंतर है?

मेरा विशिष्ट लक्ष्य पायथन से निम्न आदेश चलाने के लिए है। मुझे यकीन नहीं है कि रीडायरेक्ट कैसे काम करता है।

./my_script.sh > output 

मैं the documentation पढ़ सकते हैं और यह कहते हैं कि call() एक सुविधा समारोह या एक शॉर्टकट कार्य है। क्या हम Popen() के बजाय call() का उपयोग कर किसी भी शक्ति को खो देते हैं?

+0

प्रलेखन का कौन सा हिस्सा आपको भ्रमित करता है? 'कॉल() 'की परिभाषा बहुत स्पष्ट प्रतीत होती है। क्या आप उद्धरण या लिंक प्रदान कर सकते हैं ताकि हम जान सकें कि उत्तर में क्या ध्यान देना है? –

उत्तर

188

वहाँ रीडायरेक्ट करने के लिए दो तरीके हैं। दोनों subprocess.Popen या subprocess.call पर लागू होते हैं।

  1. कीवर्ड तर्क shell = True या executable = /path/to/the/shell सेट और आदेश आप इसे वहाँ है बस के रूप में निर्दिष्ट करें।

  2. जब से तुम सिर्फ एक फाइल करने के लिए उत्पादन रीडायरेक्ट करते हैं, कीवर्ड तर्क

    stdout = an_open_writeable_file_object 
    

    जहां सेट output फाइल करने के लिए वस्तु अंक।

subprocess.Popensubprocess.call से अधिक सामान्य है।

Popen ब्लॉक नहीं है, जबकि यह चल रहा है आप इस प्रक्रिया के साथ बातचीत करने की इजाजत दी है, या अपने अजगर कार्यक्रम में अन्य बातों के साथ जारी है। Popen पर कॉल Popen ऑब्जेक्ट देता है।

call ब्लॉक करता है। हालांकि यह Popen निर्माता के रूप में सभी एक ही तर्क का समर्थन करता है, तो आप अभी भी प्रक्रिया निर्धारित कर सकते हैं 'उत्पादन, पर्यावरण चर, आदि, अपनी स्क्रिप्ट कार्यक्रम को पूरा करने के लिए इंतजार कर रहा है, और call एक कोड प्रक्रिया का प्रतिनिधित्व रिटर्न' से बाहर निकलें स्थिति।

returncode = call(*args, **kwargs) 

मूल रूप से बुला

returncode = Popen(*args, **kwargs).wait() 

call सिर्फ एक सुविधा समारोह है के समान है। यह CPython में कार्यान्वयन subprocess.py में है:

def call(*popenargs, timeout=None, **kwargs): 
    """Run command with arguments. Wait for command to complete or 
    timeout, then return the returncode attribute. 

    The arguments are the same as for the Popen constructor. Example: 

    retcode = call(["ls", "-l"]) 
    """ 
    with Popen(*popenargs, **kwargs) as p: 
     try: 
      return p.wait(timeout=timeout) 
     except: 
      p.kill() 
      p.wait() 
      raise 

आप देख सकते हैं, यह Popen चारों ओर एक पतली आवरण है।

+7

मूल रूप से पॉपन और कॉल एसिंक्रोनस और सिंक्रोनस फ़ंक्शन क्रमशः रन लिनक्स कमांड का उपयोग करते हैं। – user3016020

+1

पॉपन का उपयोग करने का क्या फायदा है? क्या कॉल करने के लिए पहले तक इंतजार करना सुरक्षित नहीं होगा? – Tom

+3

@ टॉम अक्सर नहीं। क्या होगा यदि आप कुछ आउटपुट पढ़ना चाहते हैं, तो प्रोग्राम में अधिक इनपुट भेजें, उस इनपुट से अधिक आउटपुट पढ़ें, दोहराना? – agf

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^