सबप्रोसेस रन विधि का उपयोग करके पायथन में शेल कमांड कैसे निष्पादित करें

How Execute Shell Commands Python Using Subprocess Run Method



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

Subprocess.run विधि

Subprocess.run विधि तर्कों की एक सूची लेती है। जब विधि को कॉल किया जाता है, तो यह कमांड निष्पादित करता है और प्रक्रिया समाप्त होने की प्रतीक्षा करता है, अंत में एक पूर्ण प्रक्रिया ऑब्जेक्ट लौटाता है। CompletedProcess ऑब्जेक्ट stdout, stderr, विधि को कॉल करते समय उपयोग किए गए मूल तर्क और एक रिटर्न कोड देता है। Stdout कमांड द्वारा निर्मित डेटा स्ट्रीम को संदर्भित करता है, जबकि stderr प्रोग्राम के निष्पादन के दौरान उठाई गई किसी भी त्रुटि को संदर्भित करता है। किसी भी गैर-शून्य रिटर्न कोड (निकास कोड) का अर्थ होगा subprocess.run विधि में निष्पादित कमांड के साथ त्रुटि।







उदाहरण 1: Subprocess.run विधि का उपयोग करके टेक्स्ट फ़ाइल की आउटपुट सामग्री

नीचे दिया गया कमांड data.txt फ़ाइल की सामग्री को आउटपुट करेगा, यह मानते हुए कि इसमें एक नाम = जॉन स्ट्रिंग है।



आयात उपप्रक्रिया
उपप्रक्रिया.Daud(['बिल्ली', 'data.txt'])

उपरोक्त कोड चलाने से निम्न आउटपुट वापस आ जाएगा:



नाम=जॉन
पूर्ण प्रक्रिया(args=['बिल्ली', 'data.txt'],वापसी कोड=0)

सूची तर्क का पहला तत्व निष्पादित किए जाने वाले आदेश का नाम है। सूची में कोई भी तत्व जो पहले तत्व का अनुसरण करता है उसे कमांड-लाइन विकल्प या स्विच माना जाता है। विकल्पों को परिभाषित करने के लिए आप सिंगल डैश और डबल डैश का भी उपयोग कर सकते हैं। उदाहरण के लिए, निर्देशिका में फ़ाइलों और फ़ोल्डरों को सूचीबद्ध करने के लिए, कोड subprocess.run([ls, -l] होगा। इनमें से अधिकांश मामलों में, आप शेल कमांड में किसी भी स्थान से अलग किए गए तर्क को एक व्यक्तिगत तत्व के रूप में मान सकते हैं। subprocess.run विधि को दी गई सूची।





उदाहरण 2: Subprocess.run विधि के आउटपुट को दबाएं

subprocess.run विधि के आउटपुट को दबाने के लिए, आपको अतिरिक्त तर्क के रूप में stdout=subprocess.DEVNULL और stderr=subprocess.DEVNULL की आपूर्ति करनी होगी।

आयात उपप्रक्रिया

उपप्रक्रिया.Daud(['बिल्ली', 'data.txt'],स्टडआउट=उपप्रक्रिया.देवनुल्ला,
स्टेडर=उपप्रक्रिया.देवनुल्ला)

ऊपर दिए गए कोड को चलाने से निम्न आउटपुट प्राप्त होगा:



CompletedProcess(args=['cat', 'data.txt'], returncode=0)

उदाहरण 3: Subprocess.run विधि का आउटपुट कैप्चर करें

subprocess.run विधि के आउटपुट को कैप्चर करने के लिए, कैप्चर_आउटपुट = ट्रू नामक एक अतिरिक्त तर्क का उपयोग करें।

आयात उपप्रक्रिया
उत्पादन= उपप्रक्रिया.Daud(['बिल्ली', 'data.txt'],कैप्चर_आउटपुट=सत्य)
प्रिंट (उत्पादन)

ऊपर दिए गए कोड को चलाने से निम्न आउटपुट प्राप्त होगा:

पूर्ण प्रक्रिया(args=['बिल्ली', 'data.txt'],वापसी कोड=0,
स्टडआउट=बी'नाम = जॉन'एन',स्टेडर=बी'')

आप output.stdout और output.stderr विधियों का उपयोग करके व्यक्तिगत रूप से stdout और stderr मानों तक पहुंच सकते हैं। आउटपुट को बाइट अनुक्रम के रूप में उत्पादित किया जाता है। आउटपुट के रूप में एक स्ट्रिंग प्राप्त करने के लिए, output.stdout.decode(utf-8) विधि का उपयोग करें। स्ट्रिंग प्रारूप में आउटपुट प्राप्त करने के लिए आप subprocess.run कॉल को अतिरिक्त तर्क के रूप में टेक्स्ट = ट्रू भी प्रदान कर सकते हैं। निकास स्थिति कोड प्राप्त करने के लिए, आप output.returncode विधि का उपयोग कर सकते हैं।

उदाहरण 4: Subprocess.run विधि द्वारा निष्पादित कमांड की विफलता पर अपवाद उठाएं

जब कमांड गैर-शून्य स्थिति से बाहर निकलता है तो अपवाद उठाने के लिए, चेक = ट्रू तर्क का उपयोग करें।

आयात उपप्रक्रिया
उपप्रक्रिया.Daud(['बिल्ली', 'डेटा.टीएक्स'],कैप्चर_आउटपुट=सत्य,मूलपाठ=सत्य,जाँच=सत्य)

ऊपर दिए गए कोड को चलाने से निम्न आउटपुट प्राप्त होगा:

CalledProcessError (retcode, process.args, बढ़ाएँ)
subprocess.CalledProcessError: कमांड '['बिल्ली', 'data.tx']'
गैर-शून्य निकास स्थिति 1 लौटा दी।

उदाहरण 5: Subprocess.run विधि द्वारा निष्पादित कमांड के लिए एक स्ट्रिंग पास करें

आप इनपुट = 'स्ट्रिंग' तर्क का उपयोग करके subprocess.run विधि द्वारा निष्पादित करने के लिए एक स्ट्रिंग पास कर सकते हैं।

आयात उपप्रक्रिया
उत्पादन= उपप्रक्रिया.Daud(['बिल्ली'], इनपुट='data.txt',कैप्चर_आउटपुट=सत्य,
मूलपाठ=सत्य,जाँच=सत्य)
प्रिंट (उत्पादन)

ऊपर दिए गए कोड को चलाने से निम्न आउटपुट प्राप्त होगा:

CompletedProcess(args=['cat'], returncode=0, stdout='data.txt', stderr='')

जैसा कि आप देख सकते हैं, ऊपर दिया गया कोड data.txt को एक स्ट्रिंग के रूप में पास करता है न कि फ़ाइल ऑब्जेक्ट के रूप में। data.txt को फ़ाइल के रूप में पास करने के लिए, stdin तर्क का उपयोग करें।

साथ खोलना('data.txt') जैसाएफ:
उत्पादन= उपप्रक्रिया.Daud(['बिल्ली'],स्टडिन=एफ,कैप्चर_आउटपुट=सत्य,
मूलपाठ=सत्य,जाँच=सत्य)
प्रिंट (उत्पादन)

ऊपर दिए गए कोड को चलाने से निम्न आउटपुट प्राप्त होगा:

CompletedProcess(args=['cat'], returncode=0, stdout='name=John ', stderr='')

उदाहरण 6: Subprocess.run विधि का उपयोग करके सीधे शेल में कमांड निष्पादित करें

मुख्य कमांड और उसके बाद के विकल्पों में स्ट्रिंग स्प्लिट का उपयोग करने के बजाय, कमांड को सीधे शेल में चलाना संभव है। ऐसा करने के लिए, आपको एक अतिरिक्त तर्क के रूप में shell=True पास करना होगा। हालाँकि, यह अजगर डेवलपर्स द्वारा हतोत्साहित किया जाता है क्योंकि शेल = ट्रू का उपयोग करने से सुरक्षा समस्याएँ हो सकती हैं। आप सुरक्षा प्रभावों के बारे में अधिक पढ़ सकते हैं यहां .

आयात उपप्रक्रिया
उपप्रक्रिया.Daud('बिल्ली' data.txt '',सीप=सत्य)

ऊपर दिए गए कोड को चलाने से निम्न आउटपुट प्राप्त होगा:

नाम = जॉन

निष्कर्ष

पायथन में subprocess.run विधि बहुत शक्तिशाली है, क्योंकि यह आपको अजगर के भीतर ही शेल कमांड चलाने की अनुमति देती है। यह अलग-अलग फाइलों में अतिरिक्त शेल स्क्रिप्ट कोड की आवश्यकता के बिना सभी कोड को पायथन तक सीमित करने में मदद करता है। हालाँकि, एक अजगर सूची में शेल कमांड को सही ढंग से टोकननाइज़ करना काफी मुश्किल हो सकता है। आप सरल शेल कमांड को टोकन करने के लिए shlex.split() विधि का उपयोग कर सकते हैं, लेकिन लंबे, जटिल कमांड में - विशेष रूप से पाइप प्रतीकों वाले - shlex कमांड को सही ढंग से विभाजित करने में विफल रहता है। ऐसे मामलों में, डिबगिंग एक मुश्किल मुद्दा हो सकता है। इससे बचने के लिए आप शेल = ट्रू तर्क का उपयोग कर सकते हैं, लेकिन इस क्रिया से जुड़ी कुछ सुरक्षा चिंताएँ हैं।