python - Most pythonic way to get output from a shell command -
इस सवाल का पहले से ही एक उत्तर है: < / P>
- 13 उत्तर
मैं अपनी पहली लिख रहा हूँ अजगर कार्यक्रम और मैं एक शेल कमांड चलाने और आउटपुट प्राप्त करना चाहता हूं। मैं इसे सबसे शुद्ध संभव / सबसे अजगर तरीके से करना चाहता हूं। यह मुझे एटीएम मिल गया है नोट: मैं शेल कमांड के निष्पादन के साथ worng कुछ चला गया था, जब भी एक अपवाद बढ़ाना चाहते हैं।
def lsCommand (): प्रक्रिया = subprocess.Popen (['ls', '-a '], stdout = subprocess.PIPE, stderr = subprocess.PIPE) बाहर, अरे = process.communicate () returnc = process.returncode अगर returnc = 0: अपवाद (गलती बढ़ा) और: बाहर लौटमैंने जो खोज की है, वह यह है कि जब मैं लाइन को बाहर निकालना, err = process.communicate () , और इसे समय के साथ बदलें.Sleep (4) (& lt; = ls कमांड पूरा होने में 4 सेकंड नहीं लेते हैं), रिटर्नकोड कोई नहीं है, जिसका अर्थ है कि यह सबप्रोसेक्शन अभी तक फंस नहीं हुआ है। यह कैसे संभव है? बाहर, err = process.communicate () एक पूर्ण प्रतीक्षा करते हैं () मेथोड कॉल?
def lsCommand (): प्रक्रिया = subprocess.Popen ([' ls ',' -एक '], stdout = subprocess.PIPE, stderr = subprocess.PIPE) time.sleep (4) returnc = process.returncode अगर returnc = 0: प्रिंट returnc उठाने के अपवाद (गलती) और: बाहर लौट < / कोड>संपादित करें: मैं अजगर 2.7 का उपयोग कर रहा हूं
मैं एक लंबी कमान sudo find "/ media / usb0" -type f -name "* करना चाहता हूं .जेपीजी "| Wc -l , लेकिन मुझे यकीन नहीं है कि इसे पॉपन के साथ कैसे कॉल किया जाए, कोई भी मदद कर सकता है?
हां,
संवाद का अर्थप्रतीक्षा करें ; यह प्रक्रिया 'stdout औरstderr को तब तक पढ़ता है जब तक कि वे बंद नहीं होते।दूसरे उदाहरण में आप
PIPE का आउटपुटएलएस ; बाल प्रक्रियाls कोstdout औरstderr को लिखने तक रोक दिया जाता है जब तक कि आप पाइप से नहीं पढ़ते हैं - इस प्रकार यह 4 सेकंड के भीतर पूरा नहीं होता है, या यहां तक कि 4 साल तक जब तक इन विवरणों को पढ़ा न जाए। हालांकि, डिस्क्रिप्टर के मतदान के रूप में मैन्युअल रूप से त्रुटियों की संभावना है,Popen वर्ग मेंसंचार विधि से बचने के लिए है।
आसानी से कमांड के आउटपुट को प्राप्त करने के लिए बहुत ही अजब तरीके से, पायथन 3.1 और 2.7 के बाद से उपलब्ध है, हालांकि यह विफलता पर
stderr की सामग्री के साथ कोई अपवाद नहीं बढ़ाता है आपका पहला उदाहरण अच्छा है यदि आपको stderr की सामग्री को एक संदेश के रूप में शामिल करने के अपवाद की आवश्यकता है।
पायथन में पूर्ण पाइपलाइन को कॉल करने के लिए, आप
shell = True पूर्ण पाइपलाइन के साथ एक कमांड के रूप में।पाइपलाइन = सबप्रोसेस। पोपेन ('सूडो खोज' / 'मीडिया / यूएसबी0' -प्रकार f -name '* .JPG "| wc -l' , खोल = सच, stdout = subprocess.PIPE, stderr = subprocess.PIPE)हालांकि, अगर आप भी उपयोग कर सकते हैं
popen रों करें: < पूर्व>find = subprocess.Popen (['सुडो', 'खोज', '/ मीडिया / यूएसबी0', 'प्रकार', 'एफ', '-नाम', '* .जेपीजी'], stdout = subprocess.PIPE) WC = subprocess.Popen ([ 'WC', 'एल'], stdin = find.stdout, stdout = subprocess.PIPE, stderr = subprocess.PIPE) find.stdout.close () wc.communicate ( )
Comments
Post a Comment