2008-12-03 10 views
5

का उपयोग करते समय विफल रहता है मेरे पास कुछ पायथन कोड है जो इसे चलाने के लिए python.exe का उपयोग करते समय सही तरीके से काम करता है, लेकिन अगर मैं pythonw.exe का उपयोग करता हूं तो विफल रहता है।पायथन subprocess.call() pythonw.exe

 
    def runStuff(commandLine): 
     outputFileName = 'somefile.txt' 
     outputFile = open(outputFileName, "w") 

     try: 
      result = subprocess.call(commandLine, shell=True, stdout=outputFile) 
     except: 
      print 'Exception thrown:', str(sys.exc_info()[1]) 

    myThread = threading.Thread(None, target=runStuff, commandLine=['whatever...']) 
    myThread.start() 

संदेश मैं मिलता है:

 
    Exception thrown: [Error 6] The handle is invalid 

हालांकि, अगर मैं 'stdout' पैरामीटर निर्दिष्ट नहीं करते, subprocess.call() ठीक शुरू होता है।

मैं देख सकता हूं कि pythonw.exe आउटपुट को रीडायरेक्ट कर सकता है, लेकिन मैं नहीं देख सकता कि मुझे एक नए धागे के लिए stdout निर्दिष्ट करने से क्यों अवरुद्ध किया गया है। के रूप में यह एक deamon के रूप में चलाता है क्योंकि pythonw कंसोल सहायता प्रदान नहीं करता है, तो subprocess.call() के डिफ़ॉल्ट तर्क असफल रहे हैं

उत्तर

7

sys.stdin और sys.stdout हैंडल अमान्य हैं।

डीमॉन प्रोग्राम इरादे से stdin/stdout/stderr बंद करें और इसके बजाय लॉगिंग का उपयोग करें, ताकि आपको इसे स्वयं प्रबंधित करना पड़े: मैं subprocess.PIPE का उपयोग करने का सुझाव दूंगा।

आप वास्तव में क्या उप प्रक्रिया त्रुटियों के लिए कहते हैं और सब के बारे में परवाह नहीं है, तो आप os.devnull इस्तेमाल कर सकते हैं (मैं वास्तव में यकीन है कि यह कैसे पोर्टेबल है नहीं कर रहा हूँ?), लेकिन मुझे लगता है कि सिफारिश नहीं होगा।

6

रिकॉर्ड के लिए, मेरे कोड अब इस तरह दिखता है:

def runStuff(commandLine): 
    outputFileName = 'somefile.txt' 
    outputFile = open(outputFileName, "w") 

    if guiMode: 
     result = subprocess.call(commandLine, shell=True, stdout=outputFile, stderr=subprocess.STDOUT) 
    else: 
     proc = subprocess.Popen(commandLine, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE) 
     proc.stdin.close() 
     proc.wait() 
     result = proc.returncode 
     outputFile.write(proc.stdout.read()) 

ध्यान दें कि, उपप्रक्रिया मॉड्यूल में एक स्पष्ट बग के कारण, popen() करने के लिए कॉल के रूप में अच्छी तरह से stdin के लिए एक पाइप निर्दिष्ट करने के लिए है , जिसे हम तुरंत बाद में बंद करते हैं।

2

यह एक पुराना सवाल है, लेकिन एक ही समस्या pyInstaller के साथ भी हुई।

सच में, यह किसी भी ढांचे के साथ होगा जो बिना कंसोल के एक्सई के लिए पायथन में कोड को परिवर्तित करता है।

मेरे परीक्षणों में, मैंने देखा कि अगर मैं अपने spec फ़ाइल (pyInstaller) में ध्वज "कंसोल = ट्रू" का उपयोग करता हूं तो त्रुटि अब नहीं होती है। ।

समाधान पियेटर लेस्निकी की नोक का पालन किया गया था।

+0

मुझे वर्तमान में एक ही समस्या है, मैंने पीईक्यूटी 4 के साथ एक बड़ा आवेदन किया है और मुझे बिना किसी कंसोल के सेलेनियम मिल सकता है। कृपया मुझे बताएं कि इसे कैसे ठीक किया जाए। https://stackoverflow.com/questions/46520823/selenium-dont-work-after-exporting-to-exe-in-windowed-mode-in-pyinstaller –

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