सबप्रोसेस.पोपेन और ओएस.सिस्टम के बीच अंतर


जवाबों:


99

आप की जाँच तो अजगर किए गए दस्तावेज़ों की उपप्रक्रिया अनुभाग , तो आप देखेंगे कि कैसे को बदलने के लिए का एक उदाहरण है os.system()के साथ subprocess.Popen():

sts = os.system("mycmd" + " myarg")

... वही काम करता है ...

sts = Popen("mycmd" + " myarg", shell=True).wait()

"बेहतर" कोड अधिक जटिल दिखता है, लेकिन यह बेहतर है क्योंकि एक बार जब आप जानते हैं subprocess.Popen(), तो आपको किसी और चीज की आवश्यकता नहीं है। subprocess.Popen()कई अन्य उपकरणों की जगह (os.system() बस उन में से एक है) जो तीन अन्य पायथन मॉड्यूल में बिखरे हुए थे।

यदि यह मदद करता है, तो subprocess.Popen()एक बहुत ही लचीले के रूप में सोचें os.system()


आप sts = p.wait()अंतिम पंक्ति के बजाय भी उपयोग कर सकते हैं ।
स्वेन मार्नाच 27'11

1
@JacobMarble ऐसा लगता है कि मैं एक और अजगर स्क्रिप्ट से एक सेलेनियम स्क्रैपिंग स्क्रिप्ट कह रहा हूं, इनमें से कौन मुझे स्क्रैपिंग स्क्रिप्ट को पूरा करने की अनुमति देगा और फिर केवल और फिर कोड की अगली पंक्ति को निष्पादित करेगा? जैसा कि, निष्पादन से पहले मेरा स्क्रैपिंग पूरा हो जाना चाहिए।
प्रखर मोहन श्रीवास्तव

शायद यह भी उल्लेख करने के लिए stackoverflow.com/questions/3172470/… का उल्लेख है कि आप से बचने के लिए चाहिए shell=True। इस विकल्प के होने subprocess.Popen()और इसके सहायक कार्यों के लाभों में से एक है ।
ट्रिपल एफ

@PrakharMohanSrivastava यदि आप प्रवाह को रोकना चाहते हैं और अपने काम को पूरा करने के लिए कमांड का इंतजार करना चाहते हैं: stackoverflow.com/a/2837319/5252192
AmirHossein

@PrakharMohanSrivastava, सामान्य रूप से दोनों os.systemऔर subprocess.call/popen/runब्लॉक / कमांड खत्म होने का इंतजार करते हैं: stackoverflow.com/a/14059648/4752883
alp_989


23

os.systemयूनिक्स systemकमांड के बराबर है , जबकि एक आसान और नियंत्रणीय इंटरफ़ेस के साथ कमांड subprocessद्वारा प्रदान की गई कई सुविधाएं प्रदान करने के लिए एक सहायक मॉड्यूल बनाया गया था Popen। जिन्हें यूनिक्स पॉपेन कमांड के समान डिजाइन किया गया था।

system()कमांड में निर्दिष्ट एक कमांड को कॉल करके निष्पादित करता है /bin/sh -c command, और कमांड पूरा होने के बाद रिटर्न करता है

जहाँ तक:

popen()समारोह एक पाइप बनाने, forking, और खोल लागू द्वारा एक प्रक्रिया खोलता है।

यदि आप सोच रहे हैं कि किसका उपयोग करना है, तो subprocessनिश्चित रूप से उपयोग करें क्योंकि आपके पास निष्पादन के लिए सभी सुविधाएं हैं, साथ ही प्रक्रिया पर अतिरिक्त नियंत्रण भी है।


ठीक है..क्या ऐसा कोई तरीका है जिससे मैं os.system और popen दोनों को windows env में निष्पादित कर सकता हूं? मैं नौसिखिया हूँ और गहरी खुदाई करने की आवश्यकता है ..
अरोविट

हाँ, आप Windows पर्यावरण में os.system और subprocess दोनों का उपयोग कर सकते हैं। Effbot.org (पायथन स्टैंडर्ड लाइब्रेरी ऑनलाइन बुक) से बुनियादी ट्यूटोरियल पर एक नज़र
सेंथिल कुमारन

सावधान - यदि आप पुराने सिस्टम पर चल रहे हैं, तो सबप्रोसेस मॉड्यूल उपलब्ध नहीं है।
स्टीव हनोव

21

उपप्रकार popen2 पर आधारित है, और इस तरह के कई फायदे हैं - यहाँ PEP में पूरी सूची है , लेकिन कुछ इस प्रकार हैं:

  • खोल में पाइप का उपयोग करना
  • बेहतर newline समर्थन
  • अपवादों का बेहतर संचालन

2

जब खिड़कियों पर अजगर (CPython) चल रहा <built-in function system> os.system पर्दे के तहत निष्पादित करेंगे _wsystem जबकि यदि आप एक गैर विंडोज़ ओएस का उपयोग कर रहे हैं, यह इस्तेमाल करेंगे प्रणाली

इसके विपरीत, पॉपेन को विंडो और _posixsubprocess.fork_exec पर CreateProcess का उपयोग करना चाहिए -आधारित ऑपरेटिंग-सिस्टम में ।

उस ने कहा, एक महत्वपूर्ण टुकड़ा os.system डॉक्स से आता है , जो कहता है:

सबप्रोसेस मॉड्यूल नई प्रक्रियाओं को पैदा करने और उनके परिणामों को पुनः प्राप्त करने के लिए अधिक शक्तिशाली सुविधाएं प्रदान करता है; इस फ़ंक्शन का उपयोग करने के लिए उस मॉड्यूल का उपयोग करना बेहतर है। कुछ सहायक व्यंजनों के लिए सबप्रोसेस दस्तावेज़ में सबप्रोसेस मॉड्यूल खंड के साथ पुराने फ़ंक्शंस को देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.