2009-06-26 6 views
6

अद्यतन: जब मैं का उपयोग subprocess.Popen के बजाय subprocess.call, समस्या हल हो जाता है - किसी को भी कारण क्या है पता है? और एक और समस्या आई: मुझे आउटपुट को नियंत्रित करने का कोई तरीका नहीं दिख रहा है ... क्या आउटपुट को subprocess.call से स्ट्रिंग या उस तरह से रीडायरेक्ट करने का कोई तरीका है? धन्यवाद! जब मैं एक अजगर का उपयोग Popen(cmd,shell=true) का उपयोग कर जहां cmd के रूप में ऊपर एक ही पंक्ति है इसे चलाने के लिए लेकिन, -जब मैं कॉन्फ़िगर साथ devenv चलाने के लिए एक अजगर स्क्रिप्ट लिखने "डीबग | Win32" यह करता है कुछ भी नहीं

मैं Devenv उपयोग करने के लिए परियोजनाओं का निर्माण करने की कोशिश कर रहा हूँ, और यह ठीक चलता है जब मैं devenv A.sln /build "Debug|Win32" की तरह कमांड प्रॉम्प्ट इसमें लिखें यह कुछ भी नहीं दिखाता है। अगर मैं | हटा देता हूं, तो इसे केवल "Debug" पर बदलें, यह काम करता है ....

क्या कोई जानता है कि ऐसा क्यों होता है? मैं एक \ से पहले | डालने की कोशिश की है, लेकिन अभी भी कुछ नहीं हुआ ..

इस कोड मैं का उपयोग कर रहा है:

from subprocess import Popen, PIPE 

cmd = ' "C:\\Program Files\\Microsoft Visual Studio 8\\Common7\\IDE\\devenv" solution.sln /build "Debug|Win32" ' 

sys.stdout.flush() 
p = Popen(cmd,shell=True,stdout=PIPE,stderr=PIPE) 
lines = [] 
for line in p.stdout.readlines(): 
    lines.append(line) 
out = string.join(lines) 
print out 
if out.strip(): 
    print out.strip('\n') 
    sys.stdout.flush() 

... जो काम नहीं करता है, फिर भी, अगर मैं Debug|Win32 स्वैप Debug के साथ, यह पूरी तरह से हर टिप्पणी यहाँ के लिए काम करता ..

धन्यवाद

+0

बस मेरे सिर में पॉप-अप किया गया एक झटका, जिसे आपने पॉप किया था/क्या आप आयात विवरण दिखा सकते हैं? –

+0

ज़रूर, यह है: उपप्रक्रिया आयात popen, पाइप पी = popen (cmd, खोल = सच, stdout = पाइप, stderr = पाइप) जहां cmd ​​की तरह 'कुछ तो है ".. (पथ)/devenv" समाधान से/निर्माण "डीबग | Win32" ... ऐसा लगता है | संकेत पूरे आदेश को अनदेखा कर देता है ... –

+0

मुझे पता चला कि अजगर में मक्खी, जो पूरे 'devenv.com' आदेश होता है पर एक compile.bat फ़ाइल बनाने, और उसके बाद का उपयोग कर' Popen' एक आकर्षण की तरह काम करता अजगर से कि compile.bat चल रहा है। –

उत्तर

0

जब shell = False प्रयोग किया जाता है, यह एक एकल आदेश के रूप में स्ट्रिंग का इलाज होगा, ताकि आप आदेश पारित करने के लिए की जरूरत है/एक सूची के रूप arugments .. तरह:

from subprocess import Popen, PIPE 

cmd = [ 
    r"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv", # in raw r"blah" string, you don't need to escape backslashes 
    "solution.sln", 
    "/build", 
    "Debug|Win32" 
] 

p = Popen(cmd, stdout=PIPE, stderr=PIPE) 
out = p.stdout.read() # reads full output into string, including line breaks 

print out 
+0

वास्तव में तर्कों की सूची मेरे लिए काम नहीं करता है - जब मैं इसे चलाने के लिए, यह devenv की मदद संवाद है, जो मतलब यह होना चाहिए केवल पहला तर्क बुलाया गया था दिखा रखता है। लेकिन, आप खोल तर्क के साथ सही भावना मिल गया है - यह पता चला जब मैं खोल = सच अक्षम करें, मूल कमांड लाइन पूरी तरह से बाहर काम करता है। | के लिए अलग अर्थ होना चाहिए मुझे लगता है कि खोल विकल्प के साथ। धन्यवाद और जयकार! –

0

डबल तरह के हवाले करने का प्रयास करें: 'devenv A.sln/निर्माण "डीबग | Win32"'

+0

मैंने वास्तव में दो बार उद्धृत किया था .. –

0

ऐसा लगता है कि विंडोज़ शैल उस पाइप के रूप में | ले रहा है (उद्धरण और भागने के बावजूद)। क्या आपने इसके बजाय shell=False की कोशिश की है?

+0

जब मैं झूठी को खोलता हूं, तो मुझे कोई आउटपुट नहीं मिल रहा है, इसलिए यह सुनिश्चित नहीं हो सकता है कि यह काम कर रहा है या नहीं। क्या आप मुझे बता सकते हैं कि आउटपुट कैसे प्राप्त करें जब खोल = गलत? धन्यवाद –

+0

यह एक रहस्य है - कृपया हमें कोड का पूरा स्निपेट दिखाएं, अन्यथा इसमें कोई संदेह नहीं होगा ;-)। –

+0

यह पता चला कि यह शेल विकल्प समस्या का कारण बन गया है। यकीन नहीं है कि मैं पहले आउटपुट क्यों प्राप्त नहीं कर पा रहा था। धन्यवाद!! –

4

वहाँ devenv.exe और बीच एक अंतर है devenv.com, दोनों निष्पादन योग्य हैं और एक ही निर्देशिका (श्वास) में रहते हैं। प्रश्न में इस्तेमाल की गई कमांड लाइनें और कुछ उत्तरों यह नहीं कहते कि वे क्या चाहते हैं, इसलिए मुझे यकीन नहीं है कि कौन सा उपयोग किया जाएगा।

यदि आप कमांड लाइन से कॉल करना चाहते हैं तो आपको यह सुनिश्चित करना होगा कि आप devenv.com का उपयोग करें, अन्यथा आपको एक जीयूआई पॉपिंग होने की संभावना है। मुझे लगता है कि यह भ्रम के कुछ (लेकिन सभी नहीं) का कारण हो सकता है।

+2

यह मेरे लिए काम किया। मैं 'devenv.com' के लिए ऊपर 'devenv' बदल गया है और यह सब काम करना शुरू किया। – gman

1

अनुभाग 17.1.5.1 देखें। पायथन दस्तावेज में।

विंडोज़ पर, पायथन स्वचालित रूप से प्रोजेक्ट कॉन्फ़िगरेशन तर्क के चारों ओर डबल कोट्स जोड़ता है i.e Debug | win32 को devenv में "डीबग | win32" के रूप में पास किया जाता है। आपको डबल कोट्स जोड़ने की आवश्यकता नहीं है और आपको खोलने के लिए सही = सही होने की आवश्यकता नहीं है।

डेवनव को पारित तर्क स्ट्रिंग को देखने के लिए ProcMon का उपयोग करें।

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