उपप्रोसेस पोपेन और कॉल के बीच अंतर क्या है (मैं उनका उपयोग कैसे कर सकता हूं)?


178

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

दोनों में क्या अंतर है?

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

./my_script.sh > output

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


प्रलेखन के किस हिस्से ने आपको भ्रमित किया? इसकी परिभाषा call()बहुत स्पष्ट प्रतीत होती है। क्या आप एक उद्धरण या एक लिंक प्रदान कर सकते हैं ताकि हम जान सकें कि किसी उत्तर में क्या ध्यान दें?
S.Lott

जवाबों:


265

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

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

  2. चूंकि आप आउटपुट को किसी फ़ाइल पर पुनर्निर्देशित कर रहे हैं, कीवर्ड तर्क सेट करें

    stdout = an_open_writeable_file_object

    जहाँ ऑब्जेक्ट outputफ़ाइल को इंगित करता है।

subprocess.Popenसे अधिक सामान्य है subprocess.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


17
मूल रूप से पोपेन और कॉल एसिंक्रोनस और सिंक्रोनस फ़ंक्शन हैं जो क्रमशः लिनक्स कमांड चलाते हैं।
user3016020

1
पोपेन का उपयोग करने से क्या फायदा है? क्या यह सुरक्षित नहीं होगा जब तक कि पहले कार्यक्रम समाप्त न हो जाए?
टॉम

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

@ user3016020 मुझे लगता है कि यह विंडोज कमांड पर भी लागू होता है? सही?
डोमिन

7

अन्य उत्तर बहुत पूरा है, लेकिन यहाँ एक नियम है:

  • call अवरुद्ध है:

    call('notepad.exe')
    print('hello')  # only executed when notepad is closed
  • Popen गैर-अवरुद्ध है:

    Popen('notepad.exe')
    print('hello')  # immediately executed
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.