2009-10-06 12 views
6

मैं एक पायथन स्क्रिप्ट से एक विजुअल स्टूडियो समाधान का निर्माण करता हूं। सबकुछ अच्छी तरह से काम करता है, सिवाय इसके कि मैं बिल्ड आउटपुट को कैप्चर करने में असमर्थ हूं।पायथन, सबप्रोसेस, डेवेनव, आउटपुट क्यों नहीं?

p = subprocess.Popen(['devenv', 'solution.sln', '/build'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
(out, err) = p.communicate() 
ret = p.returncode 

यहाँ, दोनों out और err हमेशा खाली हैं। p.returncode में देखी गई बिल्ड सफलता की परवाह किए बिना यह होता है।

उत्तर

2

आपको इसके बजाय msbuild.exe के साथ समाधान बनाना चाहिए, जो stdout और stderr को प्रतिक्रिया देने के लिए डिज़ाइन किया गया है। msbuild.exe

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msbuild.exe (एक VS2005 समाधान का निर्माण करने) या C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe (एक VS2008 समाधान का निर्माण करने)

ध्यान दें कि msbuild.exedevenv.exe की तरह एक /build स्विच नहीं ले करता है पर स्थित है।

+0

आशाजनक लग रहा है, इसे जांच रहा है ... –

+0

मुझे पता है कि यह एक सवाल है, लेकिन मैंने सोचा कि मैं इस पर अन्य लाभ के लिए टिप्पणी करूंगा। हां आप इसे एमएसबिल्ड के साथ पूरा कर सकते हैं और यह एक बहुत अच्छा टूल है। लेकिन अगर आपके पास कोई समाधान है जो वीएस सेटअप प्रोजेक्ट बनाता है, तो एमएसबिल्ड उन परियोजनाओं का निर्माण नहीं करता है। मेरे पास पाइथन स्क्रिप्ट हैं जो मेरे कुछ समाधानों का निर्माण करती हैं और फिर सर्वर और मेरे अपने संग्रह में सेटअप वितरित करती हैं लेकिन मैं msbuild का उपयोग करने में असमर्थ हूं। मैं devenv.com को एक कोशिश देने जा रहा हूं और देखता हूं कि मुझे इस तरह की त्रुटियां मिल सकती हैं और मुझे लगता है कि यह मेरे और मेरी स्थिति के लिए आदर्श होगा। – jlafay

0

शायद यही कारण है कि आप जो सॉफ्टवेयर चला रहे हैं वह stdout या stderr पर नहीं लिखता है। शायद यह writes directly to the terminal/console है।

यदि ऐसा है तो आपको आउटपुट कैप्चर करने के लिए कुछ win32 api calls की आवश्यकता होगी।

+0

इस मामले में, क्या मैं अपनी स्क्रिप्ट चलाने पर स्क्रीन पर बिल्ड आउटपुट नहीं देखूंगा? –

+0

@ गिलाद: मुझे नहीं पता। शायद आपको इसे स्वयं प्रिंट करना होगा। – nosklo

+0

यदि आप आउटपुट कैप्चर करना चाहते हैं तो आप लॉग आउट पथ के साथ/आउट फ्लैग का उपयोग कर सकते हैं और इसका पालन कर सकते हैं। तब बिल्ड इवेंट को उस फ़ाइल में लॉग किया जाता है। – jlafay

-2

शायद आपकी समस्या वही है जो पाइप का बफर भर जाता है। एक अच्छे उत्तर के लिए this question देखें।

+1

नहीं, उस मामले में समस्या एक लटका होगी, और इसका समाधान p.communicate() का उपयोग करना है। ओपी को एक लटका अनुभव नहीं होता है और पहले ही p.communicate() का उपयोग करता है। –

25

इसे 'डेवेनव' से 'devenv.com' में बदलें। Apparenty Popen पहले .EXEs के लिए देखता है लेकिन खोल पहले .COMs के लिए दिखता है। 'Devenv.com' पर स्विच करने के लिए मेरे लिए काम किया।

डेवेनव वृद्धिशील बनाता है तो एमएसबिल्ड वृद्धिशील बनाता है। मैंने अभी तक एक अद्यतित परियोजना के साथ एक निर्माण किया है, जिसका अर्थ है कि कुछ भी नहीं होना चाहिए।

डेवेनव 23 सेकंड एमएसबिल्ड 55 सेकंड।

+0

मेरा मानना ​​है कि गति अंतर यह था कि 'डेवनव' समानांतर निर्माण के लिए डिफ़ॉल्ट है जहां एमएसबिल्ड नहीं है। 'Msbuild/m' आज़माएं और आपको समान गति दिखाई देनी चाहिए। Devenv.com के लिए – kizzx2

+1

+1। यही मेरे लिए काम किया है। एमएसबीयूआईएलडी वीएस 2010 के लिए उपलब्ध नहीं है। –

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