2012-04-24 11 views
11

साथ काम नहीं कर रहा है जब मैं का उपयोग कर खिड़कियों पर निम्नलिखित स्क्रिप्ट चलाने stdout और stderr की सामग्री को प्राप्त करने में सक्षम होना चाहता हूँ pythonw.exe:उपप्रक्रिया popen pythonw.exe

import subprocess 
import sys 
import os 
import string 
import time 

tmpdir = 'c:/temp' 
cmd = 'dir c:' 

tmpfile = "tmp_%f" % (time.time()) 
tmpfile = os.path.normpath(os.path.join(tmpdir,tmpfile)) 
tmpfile2 = tmpfile+".bat" 
tmpfile3 = tmpfile+".txt" 

fa = open(tmpfile2,'w') 
fa.write("@ECHO OFF > NUL\n") 
fa.write('call '+cmd+"\n") 
fa.close() 

wcmd = [] 
wcmd.append(tmpfile2) 

startupinfo = subprocess.STARTUPINFO() 
startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW 

fb = open(tmpfile3,'w') 
fb.write("\n") 
fb.write(tmpfile2+"\n") 

try: 
    procval = subprocess.Popen(wcmd, startupinfo=startupinfo, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate() 
    fb.write(str(procval)+"\n") 
    fb.write("Sucess") 
    fb.close() 
except: 
    fb.write(str(procval)+"\n") 
    fb.write("Failure") 
    fb.close() 

जब मैं यह अजगर का उपयोग कर निष्पादित .exe मुझे अपेक्षित आउटपुट मिलता है। जब मैं इसे pythonw.exe का उपयोग करके चलाता हूं तो मैं अपवाद पक्ष पर समाप्त होता हूं। यदि मैं केवल कमांड के साथ पॉपन चलाता हूं और स्टार्टअपइन्फो झंडे कमांड सफलतापूर्वक पूरा हो जाएंगे लेकिन बाल प्रक्रियाओं में डेटा तक पहुंच नहीं होगी। जो कुछ भी मैंने पढ़ा वह कहा कि यह काम करना चाहिए लेकिन कुछ याद आना चाहिए। किसी भी तरह की सहायता का स्वागत किया जाएगा।

धन्यवाद, रैंडी

+0

क्या आप अपवाद जानकारी लॉग इन करते हैं? – jdi

+0

मैंने कोशिश की है लेकिन सफल नहीं है। अपवाद जानकारी प्राप्त करने के तरीके पर किसी भी विचार को दोहराने के लिए यह आसान विचार है और इसे – user1352650

+0

मुझे समझ नहीं पाएगा। आपके पास कोड है जो ब्लॉक को छोड़कर सामान्य जेनरेट करता है फिर भी आप हमें अपवाद नहीं दिखा सकते हैं? इसे यहां बदलें: "अपवाद को छोड़कर, ई" और ई लॉग ऑन करें। या बस अंत में उठाएं ताकि आप देख सकें कि त्रुटि क्या है – jdi

उत्तर

10

यह संभवतः एक बग जब pythonw.exe का उपयोग कर

pythonw.exe एक डेमॉन प्रक्रिया है जो मानक फ़ाइल वर्णनकर्ता करने के लिए सामान्य पहुँच नहीं है शुरू होता है।

p = subprocess.Popen(wcmd, 
        startupinfo=startupinfo, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT, 
        stdin=subprocess.PIPE) 
procval = p.communicate() 
+0

लिंक 404 :( – msiemens

4

(इस जवाब के साथ कुछ साल देर से ...) मैं एक ही समस्या के पार चला और मिल गया है: केवल एक चीज आप अपनी स्क्रिप्ट में क्या करने की आवश्यकता होगी विशेष रूप से stdin के लिए 3 fd स्थापित करने के लिए है आप इस प्रतिस्थापित करना चाहिए कि:

stdout = subprocess.PIPE

इस के साथ

:

stdin = उप प्रक्रिया.पीआईपीई

अंतर्निहित समस्या पर मेरा अनुमान है: पायथन ने प्रक्रिया को लॉन्च नहीं किया है (समझ में आता है, क्योंकि कोई कंसोल नहीं है)। उप-प्रक्रिया stdin तक पहुंचने का प्रयास करती है और इससे कोई त्रुटि आती है।

स्टडीन के लिए/dev/null का उपयोग करने का एक विकल्प है, यह थ्रेड इस पर कैसे करें: Ignoring output from subprocess.Popen (सिवाय इसके कि आप stdin पर devnull का उपयोग करना चाहते हैं)।

+0

देता है आप उत्तर के साथ कुछ साल देर हो सकते हैं लेकिन यह अभी भी मेरी मदद की :) –

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