Python 3.7 - subprocess

उपप्रक्रम - उपप्रक्रम प्रबंधन




python

उपप्रक्रम - उपप्रक्रम प्रबंधन

स्रोत कोड: Lib/subprocess.py

subprocess मॉड्यूल आपको नई प्रक्रियाओं को स्पॉन करने की अनुमति देता है, उनके इनपुट / आउटपुट / त्रुटि पाइप से कनेक्ट करता है, और उनके रिटर्न कोड प्राप्त करता है। यह मॉड्यूल कई पुराने मॉड्यूल और कार्यों को बदलने का इरादा रखता है:

os.system
os.spawn*

इन मॉड्यूल को बदलने के लिए subprocess मॉड्यूल का उपयोग कैसे किया जा सकता है और कार्यों के बारे में जानकारी निम्न वर्गों में पाई जा सकती है।

यह भी देखें

PEP 324 - PEP उपप्रोसेस मॉड्यूल को प्रस्तावित करता है

उपप्रकार मॉड्यूल का उपयोग करना

सबप्रोसेस को लागू करने के लिए अनुशंसित दृष्टिकोण सभी उपयोग के मामलों के लिए run() फ़ंक्शन का उपयोग करना है जो इसे संभाल सकता है। अधिक उन्नत उपयोग के मामलों के लिए, अंतर्निहित Popen इंटरफ़ेस को सीधे उपयोग किया जा सकता है।

पायथन 3.5 में run() फ़ंक्शन जोड़ा गया था; यदि आपको पुराने संस्करणों के साथ संगतता बनाए रखने की आवश्यकता है, तो पुराने उच्च-स्तरीय API अनुभाग देखें।

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None)

Args द्वारा बताई गई कमांड चलाएँ। कमांड के पूरा होने की प्रतीक्षा करें, फिर एक CompletedProcess इंस्टेंस वापस CompletedProcess

ऊपर दिखाए गए तर्क केवल सबसे आम हैं, जिन्हें अक्सर उपयोग किए गए तर्क में नीचे वर्णित किया गया है (इसलिए संक्षिप्त हस्ताक्षर में कीवर्ड-केवल संकेतन का उपयोग)। पूर्ण फ़ंक्शन हस्ताक्षर काफी हद तक Popen कंस्ट्रक्टर के समान है - इस फ़ंक्शन के अधिकांश तर्क उस इंटरफ़ेस से गुजरते हैं। ( टाइमआउट , इनपुट , चेक और कैप्चर_आउटपुट नहीं हैं।)

अगर कैप्चर_आउट सच है, तो स्टडआउट और स्टेडर पर कब्जा कर लिया जाएगा। जब उपयोग किया जाता है, तो आंतरिक Popen ऑब्जेक्ट स्वचालित रूप से stdout=PIPE और stderr=PIPE के साथ बनाया जाता है। स्टडआउट और स्टडर तर्क का उपयोग नहीं किया जा सकता है।

टाइमआउट तर्क को Popen.communicate() पास कर दिया जाता है। यदि समय सीमा समाप्त हो जाती है, तो बच्चे की प्रक्रिया को मार दिया जाएगा और उसकी प्रतीक्षा की जाएगी। चाइल्ड प्रोसेस समाप्त होने के बाद TimeoutExpired अपवाद फिर से उठाया जाएगा।

इनपुट तर्क को Popen.communicate() और इस तरह Popen.communicate() को पास किया Popen.communicate() । यदि इसका उपयोग बाइट अनुक्रम होना चाहिए, या एन्कोडिंग या त्रुटियों को निर्दिष्ट करने या पाठ सही होने पर एक स्ट्रिंग होना चाहिए। जब उपयोग किया जाता है, तो आंतरिक Popen ऑब्जेक्ट स्वचालित रूप से Popen stdin=PIPE Popen के साथ बनाया जाता है, और Popen तर्क का भी उपयोग नहीं किया जा सकता है।

यदि जाँच सत्य है, और यह प्रक्रिया एक गैर-शून्य निकास कोड के साथ बाहर निकलती है, तो CalledProcessError अपवाद उठाया जाएगा। उस अपवाद के गुण तर्कों, बाहर निकलने के कोड और stdout और stderr को पकड़ लेते हैं, यदि वे कैप्चर किए गए थे।

यदि एन्कोडिंग या त्रुटियां निर्दिष्ट की जाती हैं, या पाठ सत्य होता है, तो निर्दिष्ट एन्कोडिंग और त्रुटियों या io.TextIOWrapper डिफ़ॉल्ट का उपयोग करके टेक्स्ट मोड में, io.TextIOWrapper , stdout और stderr के लिए फ़ाइल ऑब्जेक्ट्स को खोला जाता है। Universal_newlines तर्क पाठ के बराबर है और इसे पश्चगामी संगतता के लिए प्रदान किया गया है। डिफ़ॉल्ट रूप से, फ़ाइल ऑब्जेक्ट बाइनरी मोड में खोले जाते हैं।

यदि एनवी कोई None , तो यह एक मानचित्रण होना चाहिए जो नई प्रक्रिया के लिए पर्यावरण चर को परिभाषित करता है; इनका उपयोग वर्तमान प्रक्रिया के वातावरण को विरासत में देने के डिफ़ॉल्ट व्यवहार के बजाय किया जाता है। इसे सीधे Popen को पास किया जाता है।

उदाहरण:

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')

संस्करण 3.5 में नया।

संस्करण 3.6 में परिवर्तित: एन्कोडिंग और त्रुटियों के मापदंडों को जोड़ा गया

संस्करण 3.7 में परिवर्तित: सार्वभौमिक_न्यूलाइन्स के अधिक समझने योग्य उपनाम के रूप में, पाठ पैरामीटर को जोड़ा गया। कैप्चर_आउटपुट पैरामीटर जोड़ा गया।

class subprocess.CompletedProcess

run() से वापसी मान run() , एक प्रक्रिया का प्रतिनिधित्व करता है जो समाप्त हो गया है।

args

तर्क प्रक्रिया का शुभारंभ करते थे। यह एक सूची या एक स्ट्रिंग हो सकती है।

returncode

बच्चे की प्रक्रिया की स्थिति से बाहर निकलें। आमतौर पर, 0 से बाहर निकलने की स्थिति इंगित करती है कि यह सफलतापूर्वक चला।

एक नकारात्मक मान -N इंगित करता है कि बच्चे को संकेत N (पोसिक्स केवल) द्वारा समाप्त किया गया था।

stdout

बच्चे की प्रक्रिया से कब्जा कर लिया। एक बाइट्स अनुक्रम, या एक स्ट्रिंग यदि run() जाता है run() एन्कोडिंग, त्रुटियों, या पाठ = सही के साथ कहा जाता था। None अगर स्टैडआउट पर कब्जा नहीं किया गया था।

यदि आपने stderr=subprocess.STDOUT साथ प्रक्रिया चलाई, तो stdout और stderr को इस विशेषता में जोड़ा जाएगा, और stderr None होगा।

stderr

बच्चे की प्रक्रिया से कब्जा कर लिया stderr। एक बाइट्स अनुक्रम, या एक स्ट्रिंग यदि run() जाता है run() एन्कोडिंग, त्रुटियों, या पाठ = सही के साथ कहा जाता था। None अगर stderr पर कब्जा नहीं किया गया था।

check_returncode()

यदि returncode शून्य नहीं है, तो CalledProcessError

संस्करण 3.5 में नया।

subprocess.DEVNULL

विशेष मूल्य जो कि Popen या Popen तर्क के रूप में इस्तेमाल किया जा सकता है और इंगित करता है कि विशेष फ़ाइल os.devnull का उपयोग किया जाएगा।

संस्करण 3.3 में नया।

subprocess.PIPE

विशेष मूल्य जो कि Popen या Popen तर्क के रूप में इस्तेमाल किया जा सकता है और इंगित करता है कि मानक धारा के लिए एक पाइप खोला जाना चाहिए। Popen.communicate() साथ सबसे उपयोगी।

subprocess.STDOUT

विशेष मान जो कि Popen तर्क के रूप में Popen लिए इस्तेमाल किया जा सकता है और इंगित करता है कि मानक त्रुटि मानक आउटपुट के समान हैंडल में जाना चाहिए।

exception subprocess.SubprocessError

इस मॉड्यूल से अन्य सभी अपवादों के लिए बेस क्लास।

संस्करण 3.3 में नया।

exception subprocess.TimeoutExpired

SubprocessError का उपवर्ग, एक बच्चे की प्रक्रिया की प्रतीक्षा करते समय समय समाप्त होने पर उठाया गया।

cmd

वह आदेश जिसका उपयोग बाल प्रक्रिया को प्रोत्साहित करने के लिए किया गया था।

timeout

सेकंड में टाइमआउट।

output

चाइल्ड प्रोसेस का आउटपुट यदि इसे run() या check_output() द्वारा कैप्चर किया गया था। अन्यथा, None

stdout

आउटपुट के लिए उपनाम, stderr साथ समरूपता के लिए।

stderr

यदि यह run() द्वारा कब्जा कर लिया गया था, तो बच्चे की प्रक्रिया का स्टैडर आउटपुट। अन्यथा, None

संस्करण 3.3 में नया।

संस्करण 3.5 में बदल गया: स्टडआउट और स्टेडर विशेषताओं को जोड़ा गया

exception subprocess.CalledProcessError

SubprocessError का उपवर्ग, जब check_call() या check_output() द्वारा चलाई गई एक प्रक्रिया शून्य-शून्य निकास स्थिति लौटाती है।

returncode

बच्चे की प्रक्रिया की स्थिति से बाहर निकलें। यदि सिग्नल के कारण प्रक्रिया समाप्त हो जाती है, तो यह नकारात्मक सिग्नल संख्या होगी।

cmd

वह आदेश जिसका उपयोग बाल प्रक्रिया को प्रोत्साहित करने के लिए किया गया था।

output

चाइल्ड प्रोसेस का आउटपुट यदि इसे run() या check_output() द्वारा कैप्चर किया गया था। अन्यथा, None

stdout

आउटपुट के लिए उपनाम, stderr साथ समरूपता के लिए।

stderr

यदि यह run() द्वारा कब्जा कर लिया गया था, तो बच्चे की प्रक्रिया का स्टैडर आउटपुट। अन्यथा, None

संस्करण 3.5 में बदल गया: स्टडआउट और स्टेडर विशेषताओं को जोड़ा गया

अक्सर इस्तेमाल किए जाने वाले तर्क

विभिन्न प्रकार के उपयोग मामलों का समर्थन करने के लिए, Popen कंस्ट्रक्टर (और सुविधा फ़ंक्शंस) बड़ी संख्या में वैकल्पिक तर्क स्वीकार करते हैं। अधिकांश विशिष्ट उपयोग मामलों के लिए, इनमें से कई तर्कों को उनके डिफ़ॉल्ट मानों पर सुरक्षित रूप से छोड़ा जा सकता है। जिन तर्कों की सबसे अधिक आवश्यकता होती है, वे हैं:

सभी कॉल के लिए आर्ग की आवश्यकता होती है और एक स्ट्रिंग, या प्रोग्राम तर्क का एक क्रम होना चाहिए। तर्कों का एक क्रम प्रदान करना आमतौर पर पसंद किया जाता है, क्योंकि यह मॉड्यूल को किसी भी आवश्यक बचने और तर्कों के उद्धरण (जैसे फ़ाइल नामों में रिक्त स्थान की अनुमति देने) का ध्यान रखने की अनुमति देता है। यदि किसी एकल स्ट्रिंग को पास किया जाता है, तो शेल को True होना चाहिए (नीचे देखें) या फिर किसी भी तर्क को निर्दिष्ट किए बिना स्ट्रिंग को प्रोग्राम को निष्पादित करने के लिए नाम देना चाहिए।

stdin , stdout और stderr निष्पादित प्रोग्राम के मानक इनपुट, मानक आउटपुट और मानक त्रुटि फ़ाइल हैंडल को क्रमशः निर्दिष्ट करते हैं। मान्य मान PIPE , DEVNULL , एक मौजूदा फ़ाइल डिस्क्रिप्टर (एक सकारात्मक पूर्णांक), एक मौजूदा फ़ाइल ऑब्जेक्ट और None PIPE इंगित करता है कि बच्चे को एक नया पाइप बनाया जाना चाहिए। DEVNULL इंगित करता है कि विशेष फ़ाइल os.devnull का उपयोग किया जाएगा। किसी की डिफ़ॉल्ट सेटिंग्स के साथ, कोई पुनर्निर्देशन नहीं होगा; बच्चे की फाइल हैंडल माता-पिता से विरासत में मिली होगी। इसके अतिरिक्त, stderr STDOUT हो सकता है, जो इंगित करता है कि चाइल्ड प्रक्रिया से stderr डेटा को उसी फ़ाइल हैंडल में कैप्चर किया जाना चाहिए जैसा कि stdout के लिए है

यदि एन्कोडिंग या त्रुटियां निर्दिष्ट की जाती हैं, या टेक्स्ट (जिसे Universal_newlines के रूप में भी जाना जाता है ) सत्य है, तो कॉल में निर्दिष्ट एन्कोडिंग और त्रुटियों का उपयोग करते हुए फ़ाइल ऑब्जेक्ट्स io.TextIOWrapper , io.TextIOWrapper और io.TextIOWrapper को टेक्स्ट मोड में खोला जाएगा या io.TextIOWrapper लिए चूक।

os.linesep लिए, इनपुट में लाइन अंत अक्षर '\n' को डिफॉल्ट लाइन सेपरेटर os.linesep परिवर्तित किया जाएगा। Stdout और stderr के लिए , आउटपुट में सभी लाइन एंडिंग को '\n' बदल दिया जाएगा। अधिक जानकारी के लिए io.TextIOWrapper वर्ग का दस्तावेज़ीकरण देखें जब इसके निर्माणकर्ता के लिए नई लाइन तर्क None

यदि पाठ मोड का उपयोग नहीं किया जाता है, तो स्टडआउट , स्टडआउट और स्टेडर को बाइनरी स्ट्रीम के रूप में खोला जाएगा। कोई एन्कोडिंग या लाइन एंडिंग रूपांतरण नहीं किया जाता है।

संस्करण 3.6 में नया: एन्कोडिंग और त्रुटियों के मापदंडों को जोड़ा गया।

संस्करण 3.7 में नया: Universal_newlines के लिए एक उपनाम के रूप में पाठ पैरामीटर जोड़ा गया।

ध्यान दें

फ़ाइल ऑब्जेक्ट्स Popen.stdin , Popen.stdout और Popen.stderr की नई सूची विशेषता Popen.communicate() विधि द्वारा अपडेट नहीं की गई है।

यदि शेल True , तो निर्दिष्ट कमांड शेल के माध्यम से निष्पादित की जाएगी। यह उपयोगी हो सकता है यदि आप मुख्य रूप से पायथन का उपयोग कर रहे हैं, तो यह सबसे अधिक प्रणाली के गोले पर प्रदान किए गए बढ़ाया नियंत्रण प्रवाह के लिए है और अभी भी शेल के पाइप, फ़ाइल नाम वाइल्डकार्ड, पर्यावरण चर विस्तार, और ~ एक घर के घर के विस्तार जैसे अन्य शेल सुविधाओं के लिए सुविधाजनक उपयोग करना चाहता है। निर्देशिका। हालाँकि, ध्यान दें कि पायथन स्वयं कई शेल-जैसी विशेषताओं (विशेष रूप से, glob , fnmatch , os.walk() , os.path.expandvars() , os.path.expanduser() , और shutil ) के shutil

संस्करण 3.3 में परिवर्तित: जब locale.getpreferredencoding(False) True , तो वर्ग locale.getpreferredencoding(False) बजाय एन्कोडिंग locale.getpreferredencoding(False) का उपयोग करता है। इस परिवर्तन के बारे में अधिक जानकारी के लिए io.TextIOWrapper वर्ग देखें।

ध्यान दें

shell=True का उपयोग करने से पहले सुरक्षा विचार अनुभाग पढ़ें shell=True

ये विकल्प, अन्य सभी विकल्पों के साथ, Popen कंस्ट्रक्टर प्रलेखन में अधिक विस्तार से वर्णित हैं।

पोपन कंस्ट्रक्टर

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

class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)

एक नई प्रक्रिया में एक बच्चा कार्यक्रम निष्पादित करें। POSIX पर, कक्षा बच्चे के कार्यक्रम को निष्पादित करने के लिए os.execvp() व्यवहार का उपयोग os.execvp() । Windows पर, क्लास Windows CreateProcess() फ़ंक्शन का उपयोग करता है। Popen तर्क इस प्रकार हैं।

आर्ग्स प्रोग्राम तर्कों का एक क्रम होना चाहिए या एक ही स्ट्रिंग होना चाहिए। डिफ़ॉल्ट रूप से, निष्पादित करने का कार्यक्रम args में पहला आइटम है यदि args एक अनुक्रम है। यदि आर्ग्स एक स्ट्रिंग है, तो व्याख्या प्लेटफ़ॉर्म-निर्भर है और नीचे वर्णित है। डिफ़ॉल्ट व्यवहार से अतिरिक्त अंतर के लिए शेल और निष्पादन योग्य तर्क देखें। जब तक अन्यथा नहीं कहा जाता है, यह एक अनुक्रम के रूप में आर्ग्स को पारित करने की सिफारिश की जाती है।

POSIX पर, यदि आर्ग्स एक स्ट्रिंग है, तो स्ट्रिंग को प्रोग्राम को निष्पादित करने के लिए नाम या पथ के रूप में व्याख्या की जाती है। हालाँकि, यह केवल तभी किया जा सकता है जब प्रोग्राम में तर्क पारित नहीं किए जा रहे हों।

ध्यान दें

विशेष रूप से जटिल मामलों में, आर्ग के लिए सही टोकन का निर्धारण करते समय shlex.split() उपयोगी हो सकता है:

>>> import shlex, subprocess
>>> command_line = input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print(args)
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!

विशेष रूप से ध्यान दें कि विकल्प (जैसे -input ) और तर्क (जैसे अंडे। txt ) जो शेल में व्हाट्सएप द्वारा अलग किए गए हैं, अलग-अलग सूची तत्वों में जाते हैं, जबकि तर्क जो कि शेल में उपयोग किए जाने पर उद्धृत या बैकस्लैश भागने की आवश्यकता होती है (जैसे) रिक्त स्थान या ऊपर दिखाए गए इको कमांड वाले फाइलनाम एकल सूची तत्व हैं।

विंडोज पर, यदि आर्ग्स एक सीक्वेंस है, तो इसे एक स्ट्रीक में विंडोज के लिए एक स्ट्रिंग के लिए एक तर्क अनुक्रम परिवर्तित करने में वर्णित तरीके से एक स्ट्रिंग में बदल दिया जाएगा। ऐसा इसलिए है क्योंकि अंतर्निहित CreateProcess() स्ट्रिंग्स पर संचालित होता है।

शेल तर्क (जो False से False ) निर्दिष्ट करता है कि निष्पादन के कार्यक्रम के रूप में शेल का उपयोग करना है या नहीं। यदि शेल True , तो यह एक अनुक्रम के बजाय एक स्ट्रिंग के रूप में आर्ग्स को पारित करने की सिफारिश की जाती है।

POSIX पर shell=True साथ shell=True डिफॉल्ट /bin/sh । यदि आर्ग्स एक स्ट्रिंग है, तो स्ट्रिंग शेल के माध्यम से निष्पादित करने के लिए कमांड निर्दिष्ट करती है। इसका मतलब यह है कि स्ट्रिंग को बिल्कुल स्वरूपित किया जाना चाहिए जैसा कि शेल प्रॉम्प्ट पर टाइप किया जाएगा। इसमें शामिल हैं, उदाहरण के लिए, उन में रिक्त स्थान के साथ फ़ाइलनाम से बचना या पीछे हटाना। यदि आर्ग्स एक अनुक्रम है, तो पहला आइटम कमांड स्ट्रिंग निर्दिष्ट करता है, और किसी भी अतिरिक्त आइटम को शेल के लिए अतिरिक्त तर्क के रूप में माना जाएगा। यह कहना है, Popen के बराबर है:

Popen(['/bin/sh', '-c', args[0], args[1], ...])

shell=True साथ विंडोज पर shell=True , COMSPEC वातावरण चर डिफ़ॉल्ट शेल निर्दिष्ट करता है। केवल उस समय जब आपको shell=True को निर्दिष्ट करने की आवश्यकता होती है shell=True विंडोज पर shell=True तब होता है जब आप जिस कमांड को निष्पादित करना चाहते हैं वह शेल (जैसे डायर या कॉपी ) में बनाया गया है। आपको बैच फ़ाइल या कंसोल-आधारित निष्पादन योग्य चलाने के लिए shell=True आवश्यकता नहीं है।

ध्यान दें

shell=True का उपयोग करने से पहले सुरक्षा विचार अनुभाग पढ़ें shell=True

स्टड / स्टडआउट / स्टेटर / फाइल फाइल बनाते समय open() फ़ंक्शन के लिए इसी तर्क के रूप में bufsize को आपूर्ति की जाएगी:

  • 0 अर्थ है अनबॉर्स्ड (पढ़ना और लिखना एक सिस्टम कॉल है और इसे छोटा कर सकते हैं)
  • 1 मतलब है लाइन बफर (केवल usable_newlines universal_newlines=True यानी, टेक्स्ट मोड में)
  • किसी भी अन्य सकारात्मक मूल्य का मतलब है कि लगभग एक बफर का उपयोग करें
  • ऋणात्मक bufsize (डिफ़ॉल्ट) का अर्थ है कि सिस्टम डिफॉल्ट io.DEFAULT_BUFFER_SIZE का उपयोग किया जाएगा।

संस्करण 3.3.1 में परिवर्तित: अधिकांश कोड अपेक्षा वाले व्यवहार से मेल खाने के लिए डिफ़ॉल्ट रूप से बफरिंग को सक्षम करने के लिए अब bufize -1 को डिफ़ॉल्ट बनाता है। पाइथन 3.2.4 और 3.3.1 से पहले के संस्करणों में यह गलत तरीके से 0 डिफ़ॉल्ट रूप से बंद हो गया था जो कि अप्रभावित था और छोटे पाठों की अनुमति देता था। यह अनजाने में था और पायथन 2 के व्यवहार से मेल नहीं खाता था क्योंकि अधिकांश कोड अपेक्षित थे।

निष्पादन योग्य तर्क निष्पादित करने के लिए एक प्रतिस्थापन कार्यक्रम निर्दिष्ट करता है। इसकी बहुत कम आवश्यकता है। जब shell=False , निष्पादन योग्य args द्वारा निर्दिष्ट निष्पादित करने के लिए कार्यक्रम को बदलता है। हालांकि, मूल args अभी भी कार्यक्रम के लिए पारित किया गया है। अधिकांश प्रोग्राम कमांड नाम के रूप में आर्ग्स द्वारा निर्दिष्ट प्रोग्राम को मानते हैं, जो तब वास्तव में निष्पादित प्रोग्राम से अलग हो सकता है। POSIX पर, आर्ग्स नाम ps जैसे उपयोगिताओं में निष्पादन योग्य के लिए प्रदर्शन नाम बन जाता है। यदि shell=True , तो POSIX पर निष्पादन योग्य तर्क डिफ़ॉल्ट /bin/sh लिए एक प्रतिस्थापन शेल निर्दिष्ट करता है।

stdin , stdout और stderr निष्पादित प्रोग्राम के मानक इनपुट, मानक आउटपुट और मानक त्रुटि फ़ाइल हैंडल को क्रमशः निर्दिष्ट करते हैं। मान्य मान PIPE , DEVNULL , एक मौजूदा फ़ाइल डिस्क्रिप्टर (एक सकारात्मक पूर्णांक), एक मौजूदा फ़ाइल ऑब्जेक्ट और None PIPE इंगित करता है कि बच्चे को एक नया पाइप बनाया जाना चाहिए। DEVNULL इंगित करता है कि विशेष फ़ाइल os.devnull का उपयोग किया जाएगा। किसी की डिफ़ॉल्ट सेटिंग्स के साथ, कोई पुनर्निर्देशन नहीं होगा; बच्चे की फाइल हैंडल माता-पिता से विरासत में मिली होगी। इसके अतिरिक्त, stderr STDOUT हो सकता है, जो इंगित करता है कि अनुप्रयोगों से stderr डेटा को उसी फ़ाइल हैंडल में कैप्चर किया जाना चाहिए जैसे कि stdout।

यदि preexec_fn को कॉल करने योग्य ऑब्जेक्ट पर सेट किया जाता है, तो यह ऑब्जेक्ट बच्चे को निष्पादित होने से ठीक पहले बाल प्रक्रिया में बुलाया जाएगा। (केवल POSIX)

चेतावनी

Preexec_fn पैरामीटर आपके एप्लिकेशन में थ्रेड की उपस्थिति में उपयोग करने के लिए सुरक्षित नहीं है। निष्पादन से पहले बच्चे की प्रक्रिया गतिरोध कहला सकती है। यदि आप इसका उपयोग करते हैं, तो इसे तुच्छ रखें! आपके द्वारा कॉल किए जाने वाले पुस्तकालयों की संख्या कम से कम करें।

ध्यान दें

यदि आपको बच्चे के लिए वातावरण को संशोधित करने की आवश्यकता है तो इसे preexec_fn में करने के बजाय env पैरामीटर का उपयोग करें। Start_new_session पैरामीटर बच्चे में os.setsid () को कॉल करने के लिए preexec_fn के पहले के सामान्य उपयोग की जगह ले सकता है।

यदि close_fds सत्य है, तो 0 , 1 और 2 को छोड़कर सभी फ़ाइल डिस्क्रिप्टर को बंद कर दिया जाएगा, जब तक कि बच्चा प्रक्रिया निष्पादित नहीं हो जाता। अन्यथा जब close_fds गलत होता है, तो फाइल डिस्क्रिप्टर फाइल इनस्क्रिप्ट के इनहेरिटेंस में बताए अनुसार अपने अंतर्निहित ध्वज का पालन करते हैं।

विंडोज पर, अगर close_fds सच है, तो चाइल्ड प्रोसेस द्वारा कोई भी हैंडल विरासत में नहीं आएगा, जब तक कि handle_list के handle_list तत्व या मानक हैंडल पुनर्निर्देशन में स्पष्ट रूप से पारित नहीं हो जाता है।

वर्जन 3.2 में बदला: क्लोज़_फड्स के लिए डिफॉल्ट को ऊपर बताए गए False से बदल दिया गया।

संस्करण 3.7 में परिवर्तित: मानक हैंडल को पुनर्निर्देशित करने पर विंडोज़ पर करीब_फर्ड के लिए डिफ़ॉल्ट को False से True में बदल दिया गया था। मानक हैंडल को पुनर्निर्देशित करने पर अब True Close_fds सेट करना संभव है।

pass_fds फ़ाइल विवरणकों का एक वैकल्पिक अनुक्रम है जो माता-पिता और बच्चे के बीच खुला रहता है। किसी भी पास_फिल्ड को प्रदान करना close_fds को True होने के लिए बाध्य करता है। (केवल POSIX)

संस्करण 3.2 में नया: pass_fds पैरामीटर जोड़ा गया था।

यदि cwd कोई None , तो फ़ंक्शन बच्चे को निष्पादित करने से पहले cdd में कार्यशील निर्देशिका को बदल देता है cwd एक str और path-like ऑब्जेक्ट हो सकता है। विशेष रूप से, कार्य निष्पादन योग्य (या आइटम में पहले आइटम के लिए) सीडब्ल्यूडी के सापेक्ष दिखता है यदि निष्पादन योग्य मार्ग एक रिश्तेदार पथ है।

संस्करण 3.6 में परिवर्तित: cwd पैरामीटर एक path-like स्वीकार करता है।

यदि rest_signals सत्य है (डिफ़ॉल्ट) तो सभी संकेत जो Python ने SIG_IGN को सेट किए हैं, निष्पादन से पहले बच्चे की प्रक्रिया में SIG_DFL में पुनर्स्थापित हो जाते हैं। वर्तमान में इसमें SIGPIPE, SIGXFZ और SIGXFSZ सिग्नल शामिल हैं। (केवल POSIX)

संस्करण 3.2 में बदला: Restore_signals जोड़ा गया था।

यदि start_new_session सत्य है तो उपप्रकार के निष्पादन से पहले चाइल्ड प्रक्रिया में सेटसिड () सिस्टम कॉल किया जाएगा। (केवल POSIX)

संस्करण 3.2 में परिवर्तित: start_new_session जोड़ा गया था।

यदि एनवी कोई None , तो यह एक मानचित्रण होना चाहिए जो नई प्रक्रिया के लिए पर्यावरण चर को परिभाषित करता है; इनका उपयोग वर्तमान प्रक्रिया के वातावरण को विरासत में देने के डिफ़ॉल्ट व्यवहार के बजाय किया जाता है।

ध्यान दें

यदि निर्दिष्ट किया गया है, तो env को प्रोग्राम को निष्पादित करने के लिए आवश्यक कोई भी चर प्रदान करना चाहिए। Windows पर, साइड-बाय-साइड असेंबली चलाने के लिए निर्दिष्ट env में एक मान्य SystemRoot शामिल होना चाहिए

यदि एन्कोडिंग या त्रुटियों को निर्दिष्ट किया जाता है, या पाठ सत्य है, तो फ़ाइल ऑब्जेक्ट्स स्टडिन , स्टडआउट और स्टैडर को निर्दिष्ट एन्कोडिंग और त्रुटियों के साथ पाठ मोड में खोला जाता है, जैसा कि अक्सर उपयोग किए गए तर्क में ऊपर वर्णित है। Universal_newlines तर्क पाठ के बराबर है और इसे पश्चगामी संगतता के लिए प्रदान किया गया है। डिफ़ॉल्ट रूप से, फ़ाइल ऑब्जेक्ट बाइनरी मोड में खोले जाते हैं।

संस्करण 3.6 में नया: एन्कोडिंग और त्रुटियां जोड़ी गईं।

संस्करण 3.7 में नया: टेक्स्ट को Universal_newlines के लिए अधिक पठनीय उपनाम के रूप में जोड़ा गया था।

यदि दिया जाता है, तो स्टार्टअपइनफो एक STARTUPINFO ऑब्जेक्ट होगा, जिसे अंतर्निहित CreateProcess फ़ंक्शन में पास किया जाता है। सृजनफ्लैग , यदि दिया जाता है, तो निम्न में से एक या अधिक हो सकते हैं:

पॉपेन ऑब्जेक्ट्स को कथन के माध्यम से संदर्भ प्रबंधकों के रूप में समर्थित किया जाता है: बाहर निकलने पर, मानक फ़ाइल वर्णनकर्ता बंद हो जाते हैं, और प्रक्रिया का इंतजार किया जाता है।

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())

संस्करण 3.2 में परिवर्तित: संदर्भ प्रबंधक समर्थन जोड़ा गया।

संस्करण 3.6 में बदल गया: यदि बच्चे की प्रक्रिया अभी भी चल रही है, तो पॉपेन विध्वंसक अब एक रिसोर्सवेयर चेतावनी का उत्सर्जन करता है।

अपवाद

नए कार्यक्रम को निष्पादित करने के लिए शुरू होने से पहले बच्चे की प्रक्रिया में उठाए गए अपवाद, माता-पिता में फिर से उठाए जाएंगे। इसके अतिरिक्त, अपवाद ऑब्जेक्ट में child_traceback नामक एक अतिरिक्त विशेषता child_traceback , जो कि बच्चे के दृष्टिकोण से ट्रेसबैक जानकारी युक्त एक स्ट्रिंग है।

सबसे आम अपवाद OSError । यह तब होता है, उदाहरण के लिए, जब गैर-मौजूद फ़ाइल को निष्पादित करने का प्रयास किया जाता है। अनुप्रयोगों को OSError अपवादों के लिए तैयार करना चाहिए।

अगर अवैध तर्क के साथ Popen को बुलाया जाता है, तो एक Popen उठाया जाएगा।

check_call() और check_output() CalledProcessError यदि नामक प्रक्रिया एक गैर-शून्य कोड कोड लौटाती है।

सभी फ़ंक्शन और विधियाँ जो टाइमआउट पैरामीटर को स्वीकार करती हैं, जैसे call() और Popen.communicate() टाइमआउट एक्सपायर हो जाएगी यदि प्रक्रिया समाप्त होने से पहले टाइमआउट समाप्त हो जाता है।

इस मॉड्यूल में परिभाषित अपवाद SubprocessError से प्राप्त होते हैं।

संस्करण 3.3 में नया: SubprocessError बेस क्लास को जोड़ा गया था।

सुरक्षा संबंधी बातें

कुछ अन्य पॉपेन कार्यों के विपरीत, यह कार्यान्वयन कभी भी सिस्टम शेल को स्पष्ट रूप से कॉल नहीं करेगा। इसका मतलब यह है कि शेल मेटाचैकर सहित सभी वर्ण सुरक्षित रूप से बाल प्रक्रियाओं में पारित हो सकते हैं। यदि शेल को shell=True माध्यम से स्पष्ट रूप से आमंत्रित किया जाता है, तो यह सुनिश्चित करने के लिए एप्लिकेशन की जिम्मेदारी है कि शेल इंजेक्शन कमजोरियों से बचने के लिए सभी व्हाट्सएप और मेटाचैकर्स को उचित रूप से उद्धृत किया गया है।

shell=True का उपयोग करते समय, shlex.quote() फ़ंक्शन का उपयोग शेल कमांड बनाने के लिए उपयोग किए जाने वाले स्ट्रिंग्स में shlex.quote() और शेल shlex.quote() को ठीक से बचने के लिए किया जा सकता है।

वस्तुओं को आबाद करें

Popen वर्ग के उदाहरणों में निम्नलिखित विधियाँ हैं:

Popen.poll()

जाँच करें कि क्या बाल प्रक्रिया समाप्त हो गई है। सेट करें और रिटर्न returncode विशेषता। अन्यथा, None लौटाता।

Popen.wait(timeout=None)

बच्चे की प्रक्रिया समाप्त होने तक प्रतीक्षा करें। सेट करें और रिटर्न returncode विशेषता।

यदि प्रक्रिया टाइमआउट सेकंड के बाद समाप्त नहीं होती है, तो टाइमआउट TimeoutExpired अपवाद बढ़ाएं। इस अपवाद को पकड़ना और प्रतीक्षा को पुनः प्राप्त करना सुरक्षित है।

ध्यान दें

जब यह stdout=PIPE या stderr=PIPE और चाइल्ड प्रोसेस का उपयोग करते हुए गतिरोध उत्पन्न करेगा, तो एक पाइप में पर्याप्त आउटपुट उत्पन्न करता है, जिससे वह अधिक डेटा स्वीकार करने के लिए OS पाइप बफर के इंतजार में ब्लॉक हो जाता है। उस से बचने के लिए पाइप का उपयोग करते समय Popen.communicate() उपयोग करें।

ध्यान दें

फ़ंक्शन को एक व्यस्त लूप (गैर-अवरुद्ध कॉल और छोटी नींद) का उपयोग करके कार्यान्वित किया जाता है। एक एसिंक्रोनस प्रतीक्षा के लिए asyncio मॉड्यूल का उपयोग करें: asyncio.create_subprocess_exec देखें।

संस्करण 3.3 में परिवर्तित: टाइमआउट जोड़ा गया था।

Popen.communicate(input=None, timeout=None)

प्रक्रिया के साथ बातचीत करें: स्टडिन को डेटा भेजें। जब तक एंड-ऑफ़-फ़ाइल नहीं पहुंची, स्टडआउट और स्टैडर से डेटा पढ़ें। प्रक्रिया समाप्त होने तक प्रतीक्षा करें। वैकल्पिक इनपुट तर्क को बच्चे की प्रक्रिया के लिए भेजा जाने वाला डेटा होना चाहिए, या None , अगर बच्चे को कोई डेटा नहीं भेजा जाना चाहिए। यदि स्ट्रीम पाठ मोड में खोली गई हैं, तो इनपुट एक स्ट्रिंग होना चाहिए। अन्यथा, यह बाइट्स होना चाहिए।

Popen.communicate() एक टपल लौटाता है (stdout_data, stderr_data) । यदि पाठ मोड में स्ट्रीम खोले गए हैं तो डेटा तार होगा; अन्यथा, बाइट्स।

ध्यान दें कि यदि आप प्रक्रिया के स्टडिन को डेटा भेजना चाहते हैं, तो आपको स्टड stdin=PIPE पीआईपीई के साथ पॉपेन ऑब्जेक्ट बनाने की आवश्यकता है। इसी तरह, परिणाम ट्यूपल में किसी के अलावा कुछ भी प्राप्त करने के लिए, आपको stdout=PIPE और / या stderr=PIPE भी देने की आवश्यकता है।

यदि समयबाह्य सेकंड के बाद प्रक्रिया समाप्त नहीं होती है, तो टाइमआउट TimeoutExpired अपवाद उठाया जाएगा। इस अपवाद को पकड़ने और संचार को पुनः प्राप्त करने से कोई आउटपुट नहीं खोएगा।

यदि समय समाप्त हो जाता है, तो बाल प्रक्रिया को नहीं मारा जाता है, इसलिए ठीक से व्यवहार करने के लिए एक अच्छी तरह से व्यवहार किया गया आवेदन बच्चे की प्रक्रिया को मारना चाहिए और संचार समाप्त करना चाहिए:

proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

ध्यान दें

पढ़ा गया डेटा मेमोरी में बफ़र्ड है, इसलिए डेटा साइज़ बड़ा या अनलिमिटेड होने पर इस तरीके का इस्तेमाल न करें।

संस्करण 3.3 में परिवर्तित: टाइमआउट जोड़ा गया था।

Popen.send_signal(signal)

बच्चे को संकेत संकेत भेजता है।

ध्यान दें

विंडोज पर, SIGTERM terminate() लिए एक उपनाम है। CTRL_C_EVENT और CTRL_BREAK_EVENT को क्रिएटफ्लैग पैरामीटर के साथ शुरू की गई प्रक्रियाओं में भेजा जा सकता है जिसमें CREATE_NEW_PROCESS_GROUP शामिल है।

Popen.terminate()

बच्चे को रोको। Posix OS पर यह विधि बच्चे को SIGTERM भेजती है। Windows पर Win32 API फ़ंक्शन TerminateProcess() को बच्चे को रोकने के लिए कहा जाता है।

Popen.kill()

बच्चे को मार देता है। Posix OS पर फ़ंक्शन बच्चे को SIGKILL भेजता है। विंडोज kill() terminate() लिए एक उपनाम है terminate()

निम्नलिखित विशेषताएँ भी उपलब्ध हैं:

Popen.args

Popen तर्क को Popen को पारित किया गया था - कार्यक्रम के तर्कों का एक क्रम या फिर एक स्ट्रिंग।

संस्करण 3.3 में नया।

Popen.stdin

यदि स्टड तर्क पीआईपीई था, तो यह विशेषता एक लेखन योग्य स्ट्रीम ऑब्जेक्ट है जैसा कि open() द्वारा लौटाया गया है। यदि एन्कोडिंग या त्रुटियों के तर्क निर्दिष्ट किए गए थे या Universal_newlines तर्क True था, तो स्ट्रीम एक पाठ स्ट्रीम है, अन्यथा यह एक बाइट स्ट्रीम है। यदि स्टड तर्क PIPE नहीं था, तो यह विशेषता None

Popen.stdout

यदि स्टडआउट तर्क PIPE था, तो यह विशेषता एक पठनीय स्ट्रीम ऑब्जेक्ट है जैसा कि open() द्वारा लौटाया गया है। स्ट्रीम से पढ़ने से चाइल्ड प्रोसेस से आउटपुट मिलता है। यदि एन्कोडिंग या त्रुटियों के तर्क निर्दिष्ट किए गए थे या Universal_newlines तर्क True था, तो स्ट्रीम एक पाठ स्ट्रीम है, अन्यथा यह एक बाइट स्ट्रीम है। यदि स्टडआउट तर्क PIPE नहीं था, तो यह विशेषता None

Popen.stderr

यदि stderr तर्क PIPE था, तो यह विशेषता एक पठनीय स्ट्रीम ऑब्जेक्ट है जैसा कि open() द्वारा लौटाया गया है। स्ट्रीम से पढ़ने से चाइल्ड प्रोसेस से एरर आउटपुट मिलता है। यदि एन्कोडिंग या त्रुटियों के तर्क निर्दिष्ट किए गए थे या Universal_newlines तर्क True था, तो स्ट्रीम एक पाठ स्ट्रीम है, अन्यथा यह एक बाइट स्ट्रीम है। यदि stderr तर्क PIPE नहीं था, तो यह विशेषता None

चेतावनी

Popen.stdin , Popen.stdout या Popen.stderr बजाय Popen.communicate() उपयोग करें। किसी भी अन्य OS पाइप बफ़र्स को भरने और बच्चे की प्रक्रिया को अवरुद्ध करने के कारण गतिरोध से बचने के लिए।

Popen.pid

बच्चे की प्रक्रिया की प्रक्रिया आईडी।

ध्यान दें कि यदि आप शेल तर्क को True सेट करते हैं, तो यह स्पॉन शेल की प्रक्रिया आईडी है।

Popen.returncode

poll() द्वारा निर्धारित चाइल्ड रिटर्न कोड poll() और wait() और (अप्रत्यक्ष रूप से Popen.communicate() द्वारा Popen.communicate() )। कोई None मान इंगित None करता है कि प्रक्रिया अभी तक समाप्त नहीं हुई है।

एक नकारात्मक मान -N इंगित करता है कि बच्चे को संकेत N (पोसिक्स केवल) द्वारा समाप्त किया गया था।

विंडोज पॉपेन हेल्पर्स

STARTUPINFO वर्ग और निम्न स्थिरांक केवल विंडोज पर उपलब्ध हैं।

class subprocess.STARTUPINFO(*, dwFlags=0, hStdInput=None, hStdOutput=None, hStdError=None, wShowWindow=0, lpAttributeList=None)

Popen निर्माण के लिए Windows STARTUPINFO संरचना का आंशिक समर्थन उपयोग किया जाता है। निम्नलिखित विशेषताएँ उन्हें केवल-तर्क के रूप में पारित करके निर्धारित की जा सकती हैं।

संस्करण 3.7 में परिवर्तित: कीवर्ड-केवल तर्क समर्थन जोड़ा गया था।

dwFlags

एक बिट फ़ील्ड जो यह निर्धारित करता है कि प्रक्रिया बनाते समय कुछ STARTUPINFO विशेषताओं का उपयोग किया जाता है या नहीं।

si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
hStdInput

यदि dwFlags निर्दिष्ट STARTF_USESTDHANDLES , तो यह विशेषता प्रक्रिया के लिए मानक इनपुट हैंडल है। यदि STARTF_USESTDHANDLES निर्दिष्ट नहीं है, तो मानक इनपुट के लिए डिफ़ॉल्ट कीबोर्ड बफर है।

hStdOutput

यदि dwFlags निर्दिष्ट STARTF_USESTDHANDLES , तो यह विशेषता प्रक्रिया के लिए मानक आउटपुट हैंडल है। अन्यथा, इस विशेषता को अनदेखा किया जाता है और मानक आउटपुट के लिए डिफ़ॉल्ट कंसोल विंडो का बफर है।

hStdError

यदि dwFlags निर्दिष्ट STARTF_USESTDHANDLES , तो यह विशेषता प्रक्रिया के लिए मानक त्रुटि हैंडल है। अन्यथा, इस विशेषता को अनदेखा किया जाता है और मानक त्रुटि के लिए डिफ़ॉल्ट कंसोल विंडो का बफर है।

wShowWindow

यदि dwFlags निर्दिष्ट STARTF_USESHOWWINDOW , तो यह विशेषता ShowWindow को छोड़कर ShowWindow फ़ंक्शन के लिए nCmdShow पैरामीटर में निर्दिष्ट किए जा सकने वाले किसी भी मान की हो सकती है। अन्यथा, इस विशेषता को अनदेखा कर दिया जाता है।

SW_HIDE को इस विशेषता के लिए प्रदान किया गया है। इसका उपयोग तब किया जाता है जब Popen को shell=True साथ बुलाया जाता है।

lpAttributeList

STARTUPINFOEX में दी गई प्रक्रिया निर्माण के लिए अतिरिक्त विशेषताओं का एक शब्दकोश, UpdateProcThreadAttribute देखें।

समर्थित विशेषताएँ:

handle_list

संभालती है कि विरासत में लिया जाएगा की अनुक्रम। अगर खाली नहीं है तो close_fds सही होना चाहिए।

Popen कंस्ट्रक्टर को पास किए जाने पर, os.set_handle_inheritable() द्वारा हैंडल को अस्थायी रूप से os.set_handle_inheritable() किया जाना चाहिए, अन्यथा OSError को Windows त्रुटि ERROR_INVALID_PARAMETER (87) के साथ उठाया जाएगा।

चेतावनी

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

संस्करण 3.7 में नया।

विंडोज कांस्टेंट

subprocess मॉड्यूल निम्नलिखित स्थिरांक को उजागर करता है।

subprocess.STD_INPUT_HANDLE

मानक इनपुट डिवाइस। प्रारंभ में, यह कंसोल इनपुट बफर है, CONIN$

subprocess.STD_OUTPUT_HANDLE

मानक आउटपुट डिवाइस। प्रारंभ में, यह सक्रिय कंसोल स्क्रीन बफर है, CONOUT$

subprocess.STD_ERROR_HANDLE

मानक त्रुटि डिवाइस। प्रारंभ में, यह सक्रिय कंसोल स्क्रीन बफर है, CONOUT$

subprocess.SW_HIDE

खिड़की छिपा देता है। एक और विंडो सक्रिय हो जाएगी।

subprocess.STARTF_USESTDHANDLES

निर्दिष्ट करता है कि STARTUPINFO.hStdInput , STARTUPINFO.hStdOutput और STARTUPINFO.hStdError विशेषताओं में अतिरिक्त जानकारी है।

subprocess.STARTF_USESHOWWINDOW

निर्दिष्ट करता है कि STARTUPINFO.wShowWindow विशेषता में अतिरिक्त जानकारी है।

subprocess.CREATE_NEW_CONSOLE

नई प्रक्रिया में अपने माता-पिता के कंसोल (डिफ़ॉल्ट) को प्राप्त करने के बजाय एक नया कंसोल है।

subprocess.CREATE_NEW_PROCESS_GROUP

एक Popen creationflags समूह बनाया जाएगा यह निर्दिष्ट करने के लिए एक Popen पैरामीटर। यह ध्वज os.kill() पर os.kill() का उपयोग करने के लिए आवश्यक है।

अगर CREATE_NEW_CONSOLE निर्दिष्ट किया गया है तो इस ध्वज को अनदेखा किया CREATE_NEW_CONSOLE है।

subprocess.ABOVE_NORMAL_PRIORITY_CLASS

निर्दिष्ट करने के लिए एक Popen पैरामीटर कि एक नई प्रक्रिया में एक उपरोक्त औसत प्राथमिकता होगी।

संस्करण 3.7 में नया।

subprocess.BELOW_NORMAL_PRIORITY_CLASS

एक Popen पैरामीटर निर्दिष्ट करने के लिए कि एक नई प्रक्रिया में औसत से कम प्राथमिकता होगी।

संस्करण 3.7 में नया।

subprocess.HIGH_PRIORITY_CLASS

यह Popen लिए कि एक नई प्रक्रिया में एक उच्च प्राथमिकता होगी, एक Popen पैरामीटर।

संस्करण 3.7 में नया।

subprocess.IDLE_PRIORITY_CLASS

एक Popen पैरामीटर निर्दिष्ट करता है कि एक नई प्रक्रिया में एक निष्क्रिय (सबसे कम) प्राथमिकता होगी।

संस्करण 3.7 में नया।

subprocess.NORMAL_PRIORITY_CLASS

यह Popen लिए कि एक नई प्रक्रिया के लिए एक सामान्य Popen पैरामीटर एक सामान्य प्राथमिकता होगी। (चूक)

संस्करण 3.7 में नया।

subprocess.REALTIME_PRIORITY_CLASS

यह Popen लिए कि एक नई प्रक्रिया में रियलटाइम प्राथमिकता होगी, एक Popen पैरामीटर। आपको लगभग REALTIME_PRIORITY_CLASS का उपयोग कभी नहीं करना चाहिए, क्योंकि इससे सिस्टम थ्रेड्स में माउस इनपुट, कीबोर्ड इनपुट और बैकग्राउंड डिस्क फ्लशिंग का प्रबंधन होता है। यह वर्ग उन अनुप्रयोगों के लिए उपयुक्त हो सकता है जो सीधे हार्डवेयर में "बात" करते हैं या जो संक्षिप्त कार्य करते हैं जिनमें सीमित व्यवधान होना चाहिए।

संस्करण 3.7 में नया।

subprocess.CREATE_NO_WINDOW

यह Popen लिए कि एक नई प्रक्रिया एक विंडो नहीं Popen एक Popen पैरामीटर

संस्करण 3.7 में नया।

subprocess.DETACHED_PROCESS

यह Popen लिए कि एक नई प्रक्रिया अपने माता-पिता के सांत्वना को विरासत में नहीं देगी, एक Popen पैरामीटर। इस मान का उपयोग CREATE_NEW_CONSOLE के साथ नहीं किया जा सकता है।

संस्करण 3.7 में नया।

subprocess.CREATE_DEFAULT_ERROR_MODE

यह Popen लिए कि कोई नई प्रक्रिया कॉलिंग प्रक्रिया के त्रुटि मोड को इनहेरिट नहीं करती है, Popen पैरामीटर। इसके बजाय, नई प्रक्रिया को डिफ़ॉल्ट त्रुटि मोड मिलता है। यह सुविधा विशेष रूप से उन मल्टीथ्रेड शेल अनुप्रयोगों के लिए उपयोगी है जो हार्ड एरर के साथ चलते हैं।

संस्करण 3.7 में नया।

subprocess.CREATE_BREAKAWAY_FROM_JOB

यह निर्दिष्ट करने के लिए एक पैरामीटर कि एक नई प्रक्रिया नौकरी से जुड़ी नहीं है। Popen creationflags

संस्करण 3.7 में नया।

पुराना उच्च स्तरीय एपीआई

पायथन 3.5 से पहले, इन तीन कार्यों में उच्च स्तरीय एपीआई से लेकर सबप्रोसेस शामिल थे। अब आप run() कई मामलों में उपयोग कर सकते हैं , लेकिन बहुत सारे मौजूदा कोड इन कार्यों को कहते हैं।

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)

आर्ग्स द्वारा बताई गई कमांड को चलाएं । कमांड के पूरा होने तक प्रतीक्षा करें, फिर returncode विशेषता वापस करें ।

यह इसके बराबर है:

run(...).returncode

(सिवाय इसके कि इनपुट और चेक पैरामीटर समर्थित नहीं हैं)

ऊपर दिखाए गए तर्क केवल सबसे आम हैं। पूर्ण फ़ंक्शन हस्ताक्षर मोटे तौर पर Popen कंस्ट्रक्टर के समान है - यह फ़ंक्शन उस इंटरफ़ेस के माध्यम से सीधे टाइमआउट के अलावा सभी आपूर्ति किए गए तर्कों को पारित करता है।

ध्यान दें

इस फ़ंक्शन का उपयोग न करें stdout=PIPE या न करें stderr=PIPE । बाल प्रक्रिया अवरुद्ध हो जाएगी यदि यह ओएस पाइप बफर को भरने के लिए एक पाइप के लिए पर्याप्त आउटपुट उत्पन्न करता है क्योंकि पाइप से पढ़ा नहीं जा रहा है।

संस्करण 3.3 में परिवर्तित: टाइमआउट जोड़ा गया था।

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)

तर्कों के साथ कमांड चलाएं। कमांड के पूरा होने की प्रतीक्षा करें। यदि रिटर्न कोड शून्य था तो वापस करें, अन्यथा बढ़ाएं CalledProcessError CalledProcessError वस्तु में वापसी कोड होगा returncode विशेषता।

यह इसके बराबर है:

run(..., check=True)

(सिवाय इसके कि इनपुट पैरामीटर समर्थित नहीं है)

ऊपर दिखाए गए तर्क केवल सबसे आम हैं। पूर्ण फ़ंक्शन हस्ताक्षर मोटे तौर पर Popen कंस्ट्रक्टर के समान है - यह फ़ंक्शन उस इंटरफ़ेस के माध्यम से सीधे टाइमआउट के अलावा सभी आपूर्ति किए गए तर्कों को पारित करता है।

ध्यान दें

इस फ़ंक्शन का उपयोग न करें stdout=PIPE या न करें stderr=PIPE । बाल प्रक्रिया अवरुद्ध हो जाएगी यदि यह ओएस पाइप बफर को भरने के लिए एक पाइप के लिए पर्याप्त आउटपुट उत्पन्न करता है क्योंकि पाइप से पढ़ा नहीं जा रहा है।

संस्करण 3.3 में परिवर्तित: टाइमआउट जोड़ा गया था।

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=False, timeout=None)

तर्कों के साथ कमांड चलाएँ और इसका आउटपुट लौटाएँ।

यदि रिटर्न कोड गैर-शून्य था तो यह एक बढ़ा देता है CalledProcessError CalledProcessError वस्तु में वापसी कोड होगा returncode विशेषता और किसी भी उत्पादन output विशेषता।

यह इसके बराबर है:

run(..., check=True, stdout=PIPE).stdout

ऊपर दिखाए गए तर्क केवल सबसे आम हैं। पूर्ण फ़ंक्शन हस्ताक्षर मोटे तौर पर उसी के समान है run() - अधिकांश तर्क सीधे उस इंटरफ़ेस से गुजरते हैं। हालाँकि, input=None माता-पिता के मानक इनपुट फ़ाइल हैंडल को इनहेरिट करने के लिए स्पष्ट रूप से पास करना समर्थित नहीं है।

डिफ़ॉल्ट रूप से, यह फ़ंक्शन डेटा को एन्कोडेड बाइट्स के रूप में लौटाएगा। आउटपुट डेटा की वास्तविक एन्कोडिंग को कमांड के द्वारा भेजे जाने पर निर्भर हो सकता है, इसलिए टेक्स्ट को डिकोडिंग को अक्सर एप्लिकेशन स्तर पर नियंत्रित करना होगा।

यह व्यवहार की स्थापना द्वारा ओवरराइड किया जा सकता universal_newlines के True रूप में ऊपर वर्णित अक्सर प्रयुक्त तर्क

परिणाम में मानक त्रुटि को पकड़ने के लिए, उपयोग करें stderr=subprocess.STDOUT :

>>> subprocess.check_output(
...     "ls non_existent_file; exit 0",
...     stderr=subprocess.STDOUT,
...     shell=True)
'ls: non_existent_file: No such file or directory\n'

संस्करण 3.1 में नया।

संस्करण 3.3 में परिवर्तित: टाइमआउट जोड़ा गया था।

संस्करण 3.4 में परिवर्तित: इनपुट कीवर्ड तर्क के लिए समर्थन जोड़ा गया था।

संस्करण 3.6 में परिवर्तित: एन्कोडिंग और त्रुटियों को जोड़ा गया था। run() विवरण के लिए देखें।

उपप्रकार मॉड्यूल के साथ पुराने कार्यों को बदलना

इस खंड में, "एक बन जाता है" का अर्थ है कि बी का उपयोग प्रतिस्थापन के रूप में किया जा सकता है।

ध्यान दें

इस खंड में सभी "ए" कार्य विफल (अधिक या कम) चुपचाप अगर निष्पादित कार्यक्रम नहीं मिल सकता है; OSError इसके बजाय "बी" प्रतिस्थापन उठाते हैं।

इसके अलावा, उपयोग करने वाले प्रतिस्थापन check_output() एक असफल CalledProcessError -शून्य रिटर्न कोड का उत्पादन करने पर फेल हो जाएंगे । आउटपुट अभी भी output उठाए गए अपवाद की विशेषता के रूप में उपलब्ध है।

निम्नलिखित उदाहरणों में, हम मानते हैं कि संबंधित कार्य पहले ही subprocess मॉड्यूल से आयात किए जा चुके हैं ।

रिप्लेसमेंट / बिन / श शेल बैककॉट

output=`mycmd myarg`

हो जाता है:

output = check_output(["mycmd", "myarg"])

खोल पाइपलाइन की जगह

output=`dmesg | grep hda`

हो जाता है:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

P2 शुरू करने के बाद p1.stdout.close () कॉल p1 के पहले बाहर निकलने पर यदि S1PIPE प्राप्त करने के लिए p1 के लिए महत्वपूर्ण है।

वैकल्पिक रूप से, भरोसेमंद इनपुट के लिए, शेल की अपनी पाइपलाइन समर्थन अभी भी सीधे इस्तेमाल की जा सकती है:

output=`dmesg | grep hda`

हो जाता है:

output=check_output("dmesg | grep hda", shell=True)

की जगह os.system()

sts = os.system("mycmd" + " myarg")
# becomes
sts = call("mycmd" + " myarg", shell=True)

टिप्पणियाँ:

  • शेल के माध्यम से प्रोग्राम को कॉल करना आमतौर पर आवश्यक नहीं है।

एक और अधिक यथार्थवादी उदाहरण इस तरह दिखेगा:

try:
    retcode = call("mycmd" + " myarg", shell=True)
    if retcode < 0:
        print("Child was terminated by signal", -retcode, file=sys.stderr)
    else:
        print("Child returned", retcode, file=sys.stderr)
except OSError as e:
    print("Execution failed:", e, file=sys.stderr)

os.spawn परिवार को बदलना

P_NOWAIT उदाहरण:

pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
==>
pid = Popen(["/bin/mycmd", "myarg"]).pid

P_WAIT उदाहरण:

retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
==>
retcode = call(["/bin/mycmd", "myarg"])

वेक्टर उदाहरण:

os.spawnvp(os.P_NOWAIT, path, args)
==>
Popen([path] + args[1:])

पर्यावरण उदाहरण:

os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
==>
Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})

की जगह os.popen() , os.popen2() , os.popen3()

(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdin, child_stdout) = (p.stdin, p.stdout)
(child_stdin,
 child_stdout,
 child_stderr) = os.popen3(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
(child_stdin,
 child_stdout,
 child_stderr) = (p.stdin, p.stdout, p.stderr)
(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)

रिटर्न कोड हैंडलिंग का अनुवाद इस प्रकार है:

pipe = os.popen(cmd, 'w')
...
rc = pipe.close()
if rc is not None and rc >> 8:
    print("There were some errors")
==>
process = Popen(cmd, stdin=PIPE)
...
process.stdin.close()
if process.wait() != 0:
    print("There were some errors")

popen2 मॉड्यूल से कार्यों को बदलना

ध्यान दें

यदि popen2 फ़ंक्शन के लिए cmd तर्क एक स्ट्रिंग है, तो कमांड को बिन / श के माध्यम से निष्पादित किया जाता है। यदि यह एक सूची है, तो कमांड को सीधे निष्पादित किया जाता है।

(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
==>
p = Popen("somestring", shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)
(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
==>
p = Popen(["mycmd", "myarg"], bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)

popen2.Popen3 और इसके अलावा popen2.Popen4 मूल रूप से काम करते हैं Popen :

  • Popen यदि निष्पादन विफल हो जाता है तो एक अपवाद उठाता है।
  • capturestderr तर्क साथ बदल दिया है stderr तर्क।
  • stdin=PIPE और stdout=PIPE निर्दिष्ट किया जाना चाहिए।
  • popen2 डिफ़ॉल्ट रूप से सभी फ़ाइल वर्णनकर्ता बंद कर देता है, लेकिन आपको यह निर्दिष्ट करना close_fds=True साथ Popen सभी प्लेटफार्मों पर या पिछले अजगर संस्करण इस व्यवहार की गारंटी है।

लीगेसी शेल इनवोकेशन फ़ंक्शंस

यह मॉड्यूल 2.x commands मॉड्यूल से निम्न विरासत कार्य भी प्रदान करता है । ये ऑपरेशन सिस्टम शेल को स्पष्ट रूप से लागू करते हैं और सुरक्षा और अपवाद हैंडलिंग स्थिरता के बारे में ऊपर वर्णित कोई भी गारंटी इन कार्यों के लिए मान्य नहीं है।

subprocess.getstatusoutput(cmd)

एक शेल में सीएमडी (exitcode, output) निष्पादित करने की वापसी ।

स्ट्रिंग सेमी को खोल के साथ निष्पादित करें Popen.check_output() और 2-ट्यूपल लौटें (exitcode, output) । स्थानीय एन्कोडिंग का उपयोग किया जाता है; अधिक जानकारी के लिए अक्सर उपयोग किए गए तर्क पर नोट देखें।

आउटपुट से एक अनुगामी न्यूलाइन छीन ली जाती है। कमांड के लिए एग्जिट कोड को सबप्रोसेस के रिटर्न कोड के रूप में समझा जा सकता है। उदाहरण:

>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> subprocess.getstatusoutput('cat /bin/junk')
(1, 'cat: /bin/junk: No such file or directory')
>>> subprocess.getstatusoutput('/bin/junk')
(127, 'sh: /bin/junk: not found')
>>> subprocess.getstatusoutput('/bin/kill $$')
(-15, '')

उपलब्धता: POSIX और विंडोज

संस्करण 3.3.4 में परिवर्तित: Windows समर्थन जोड़ा गया था।

यह फ़ंक्शन अब (स्थिति, आउटपुट) के बजाय (एक्ज़िटकोड, आउटपुट) देता है, जैसा कि पायथन 3.3.3 और इससे पहले किया था। बाहर निकलने के मूल्य के समान है returncode

subprocess.getoutput(cmd)

शेल में सीएमडी निष्पादित करने का आउटपुट (स्टडआउट और स्टडर) लौटाएं ।

जैसे getstatusoutput() , एक्जिट कोड को छोड़कर अनदेखा किया जाता है और रिटर्न वैल्यू एक स्ट्रिंग है जिसमें कमांड का आउटपुट होता है। उदाहरण:

>>> subprocess.getoutput('ls /bin/ls')
'/bin/ls'

उपलब्धता: POSIX और विंडोज

संस्करण 3.3.4 में परिवर्तित: Windows समर्थन जोड़ा गया

टिप्पणियाँ

विंडोज पर एक स्ट्रिंग के लिए एक तर्क अनुक्रम परिवर्तित करना

विंडोज पर, एक आर्ग्स अनुक्रम एक स्ट्रिंग में बदल जाता है जिसे निम्नलिखित नियमों का उपयोग करके पार्स किया जा सकता है (जो एमएस सी रनटाइम द्वारा उपयोग किए गए नियमों के अनुरूप है):

  1. तर्क को सफेद स्थान द्वारा सीमांकित किया जाता है, जो या तो एक स्थान या एक टैब है।
  2. दोहरे उद्धरण चिह्नों से घिरे एक स्ट्रिंग को एकल तर्क के रूप में व्याख्या की जाती है, भले ही भीतर निहित सफेद स्थान की परवाह किए बिना। एक उद्धृत स्ट्रिंग को एक तर्क में एम्बेड किया जा सकता है।
  3. बैकस्लैश से पहले के दोहरे उद्धरण चिह्न की व्याख्या शाब्दिक दोहरे उद्धरण चिह्न के रूप में की जाती है।
  4. बैकस्लैश की शाब्दिक व्याख्या की जाती है, जब तक कि वे तुरंत दोहरे उद्धरण चिह्न से पहले न हों।
  5. यदि बैकस्लैश तुरंत दोहरे उद्धरण चिह्न से पहले आते हैं, तो बैकस्लैश की प्रत्येक जोड़ी को शाब्दिक बैकलैश के रूप में व्याख्या की जाती है। यदि बैकस्लैश की संख्या विषम है, तो अंतिम बैकस्लैश नियम 3 में वर्णित अगले दोहरे उद्धरण चिह्न से बच जाता है।

यह भी देखें

shlex
मॉड्यूल जो कमांड लाइनों को पार्स और एस्केप करने के लिए फ़ंक्शन प्रदान करता है।

Original text