2013-02-06 9 views
9

से आउटपुट को अनदेखा करना मैं अपनी पायथन स्क्रिप्ट से जावा प्रोग्राम को कॉल कर रहा हूं, और यह बहुत सारी बेकार जानकारी को आउटपुट कर रहा है जो मैं नहीं चाहता हूं। मैं popen कार्य करने के लिए addind stdout=None की कोशिश की है:subprocess.Popen

subprocess.Popen(['java', '-jar', 'foo.jar'], stdout=None) 

लेकिन यह एक ही करता है। कोई उपाय?

उत्तर

31

3.3 documentation से:

stdin, stdout और stderr निष्पादित कार्यक्रम के मानक इनपुट, मानक निर्दिष्ट क्रमशः आउटपुट और मानक त्रुटि फ़ाइल हैंडल। वैध मान PIPE, DEVNULL, एक मौजूदा फ़ाइल डिस्क्रिप्टर (एक सकारात्मक पूर्णांक), एक मौजूदा फ़ाइल ऑब्जेक्ट, और कोई नहीं हैं।

तो:

subprocess.check_call(['java', '-jar', 'foo.jar'], stdout=subprocess.DEVNULL) 

यह केवल 3.3 और बाद में मौजूद है। लेकिन प्रलेखन कहते हैं:

DEVNULL इंगित करता है कि विशेष फ़ाइल os.devnull इस्तेमाल किया जाएगा।

और os.devnull तरह से वापस 2.4 करने के लिए (से पहले से ही अस्तित्व में subprocess) मौजूद है। कि तुम उस एक ही पंक्ति में फिट नहीं करता है कुछ और अधिक जटिल कर रहे हैं, आप Popen के पूरे जीवन के लिए devnull खुला रखने की जरूरत है

with open(os.devnull, 'w') as devnull: 
    subprocess.check_call(['java', '-jar', 'foo.jar'], stdout=devnull) 

नोट: तो, आप एक ही बात मैन्युअल रूप से कर सकते हैं ऑब्जेक्ट, न केवल इसके निर्माण।

/dev/null (इसे POSIX) या NUL: (विंडोज़) के लिए पुनः निर्देशित का लाभ कर सकते हैं (यही है, पूरी बात with बयान के अंदर डाल दिया।) आप एक अनावश्यक पाइप बनाने नहीं है, और अधिक महत्वपूर्ण बात है, ' किनारे के मामलों में भाग नहीं लेते हैं जहां उस पाइप को लिखने पर उपप्रोसेस ब्लॉक।

नुकसान यह है कि, सिद्धांत में, subprocess कुछ प्लेटफार्मों पर काम कर सकता है जो os.devnull नहीं है। यदि आप केवल पॉसिक्स और विंडोज, पीपीपी और ज्योथन (जो आप में से अधिकांश हैं) पर सीपीथॉन की परवाह करते हैं, तो यह कभी भी कोई समस्या नहीं होगी। अन्य मामलों के लिए, अपना कोड वितरित करने से पहले परीक्षण करें।

+0

+1: devnull के लिए। सुनिश्चित करें कि subprocess जीवित है, जबकि 'devnull' खुला रहता है (साथ-साथ कथन का अर्थ अन्यथा है)। अंतिम पैराग्राफ अनावश्यक लगता है: DEVNULL को ऑप्शन में ओशनडेन के माध्यम से लागू किया गया है। os.devnull ज्योथन के साथ काम करता है। – jfs

+0

@ जेएफ। सेबेस्टियन: 'चेक_call' (जो' के साथ 'के अंदर है) के बाद,' devnull' की आवश्यकता नहीं है। लेकिन हाँ, शायद मुझे यह स्पष्ट करना चाहिए कि अधिक जटिल उपयोग के मामलों के लिए जो एक पंक्ति में फिट नहीं होते हैं, पूरी चीज को 'पॉप' के साथ 'साथ' के अंदर होना चाहिए। – abarnert

+0

@JFSebastian: इस बीच, 'os.devnull' के लिए, क्या वास्तव में यह' प्लेटफॉर्म 'मौजूद प्रत्येक प्लेटफॉर्म पर मौजूद होने की गारंटी है, इसलिए "उपयोग करने से पहले जांचने" की कोई आवश्यकता नहीं है, या क्या आप जानते हैं कि यह भी मौजूद है ज्योथन पर और इसलिए मुझे ज्योथन को उन प्लेटफार्मों की सूची में ले जाना चाहिए जिन्हें आपको जांचने की आवश्यकता नहीं है? – abarnert

6

documentation से:

None की डिफ़ॉल्ट सेटिंग्स के साथ

, रीडायरेक्ट न हो जाएगा।

आप subprocess.PIPE को stdout निर्धारित करते हैं, तो .communicate() फोन और बस पर कब्जा कर लिया उत्पादन की अनदेखी करने की जरूरत है।

p = subprocess.Popen(['java', '-jar', 'foo.jar'], stdout=subprocess.PIPE) 
p.communicate() 

हालांकि मुझे लगता है कि अपनी आवश्यकताओं के लिए suffices से subprocess.call() अधिक का उपयोग करते हुए:

subprocess.call(['java', '-jar', 'foo.jar'], stdout=subprocess.PIPE) 
+1

@sjtaheri: सुधार के लिए धन्यवाद, मैंने इसे स्वयं लागू किया। –

+4

आमतौर पर एक पाइप बनाना और अनदेखा करना काम करता है, लेकिन अगर यह बहुत अधिक लेखन करता है तो यह बाल प्रक्रिया को अवरुद्ध कर सकता है (और निश्चित रूप से यह आपके सिस्टम पर काम कर सकता है और आपके उपयोगकर्ताओं में से एक के लिए असफल हो सकता है), इसलिए मुझे लगता है कि यह वास्तव में नहीं है ' 'संवाद' के बजाय यहां 'कॉल' करने के लिए सुरक्षित नहीं है। यह काफी है कि क्यों 'DEVNULL' जोड़ा गया था-इसलिए आप _can_ बस 'कॉल' करें और इसके बारे में चिंता न करें। (ठीक है, यह थोड़ा और जटिल मामले के लिए है, जहां आप 'stderr = DEVNULL' सेट करते हैं लेकिन 'stdout' नहीं, और केवल' check_output' सेट करते हैं। लेकिन एक ही विचार।) – abarnert

+0

@abarnert: आह, यह नहीं पता था कि जोड़ा गया था ; बस इसे पायथन 3 दस्तावेज में मिला। –

संबंधित मुद्दे