उपप्रक्रिया मॉड्यूल सुविधा समारोह call
है, जो 2.6 और 3.1 दोनों में इस तरह कार्यान्वित किया जाता है है:पाइथन का subprocess.call इस तरह कार्यान्वित क्यों किया जाता है?
def call(*popenargs, **kwargs):
return Popen(*popenargs, **kwargs).wait()
इस कार्य के लिए प्रलेखन एक लाल चेतावनी वहन करती है, पढ़ने:
चेतावनी :
Popen.wait()
की तरह, यहstdout=PIPE
और/याstderr=PIPE
का उपयोग करते समय डेडलॉक होगा और बाल प्रक्रिया पर्याप्त पाइप को पाइप में उत्पन्न करती है जैसे कि यह ओएस पाइप बफर के लिए अधिक डेटा स्वीकार करने के लिए प्रतीक्षा कर रहा है।
Popen.wait()
प्रलेखन ऐसे हालात में बजाय Popen.communicate()
उपयोग करने के लिए कहते हैं। खैर, तो call
क्यों नहीं है, बस इसके बजाय नीचे लागू किया गया है, इसलिए बेवकूफ चेतावनी को हटाया जा सकता है, और इस तरह की मूर्ख सीमाएं मानक पुस्तकालय से हटा दी गई हैं?
def call(*args, **kwargs):
input = kwargs.pop("input", None)
p = Popen(*args, **kwargs)
p.communicate(input)
return p.returncode
मुझे यकीन है कि एक कारण है। मैं क्या खो रहा हूँ?
प्रोग्राम के आउटपुट को नियंत्रित करना stdout = PIPE और stderr = PIPE का उपयोग करने के लिए एक रेजोन है। यही है, पाइथन 'कमांड>/dev/null 2> और 1' के बराबर है और फिर बैश में '$?' की जांच कर रहा है। –
क्या यह बेहतर नहीं होगा 'stdout = open ('/dev/null ',' w '), stderr = STDOUT'? –
@ बाफ मुझे लगता है, लेकिन बिंदु यह था कि वहाँ _is_ stdout = और stderr = कीवर्ड कॉल 'कॉल' का उपयोग करने का एक कारण है। –