簡體   English   中英

子進程Popen不使用pythonw.exe

[英]Subprocess Popen not working with pythonw.exe

我希望能夠在使用pythonw.exe在Windows上運行以下腳本時獲取stdout和stderr的內容:

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()

當我使用python.exe執行它時,我得到了預期的輸出。 當我使用pythonw.exe運行它時,我最終在異常端。 如果我只使用命令和startupinfo標志運行popen,命令將成功完成,但無法訪問子進程中的數據。 我讀到的所有內容都表明這應該有效但必須遺漏一些東西。 任何幫助將不勝感激。

謝謝,蘭迪

使用pythonw.exe時,這可能是一個錯誤

pythonw.exe啟動守護進程,該進程無法正常訪問標准文件描述符。 您在腳本中唯一需要做的就是專門為stdin設置第3個fd:

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

(這個答案遲了幾年......)我遇到了同樣的問題,發現你應該替換它:

標准輸出= subprocess.PIPE

有了這個:

標准輸入= subprocess.PIPE

這是我對潛在問題的猜測:pythonw啟動沒有標准輸入的進程(有意義,因為沒有控制台)。 子進程嘗試訪問stdin,這會導致錯誤。

另一種方法是對stdin使用/ dev / null,請參閱此線程以討論如何執行此操作: 忽略 subprocess.Popen的輸出 (除非您要在stdin上使用devnull)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM