子进程Popen不使用pythonw.exe

时间:2012-04-24 02:26:47

标签: python subprocess

我希望能够在使用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,命令将成功完成,但无法访问子进程中的数据。我读到的所有内容都表明这应该有效但必须遗漏一些东西。任何帮助将不胜感激。

谢谢, 好色

2 个答案:

答案 0 :(得分:11)

这可能是使用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()

答案 1 :(得分:4)

(这个答案迟了几年......)我遇到了同样的问题,发现你应该替换它:

  

标准输出= subprocess.PIPE

用这个:

  

标准输入= subprocess.PIPE

这是我对潜在问题的猜测:pythonw启动没有stdin的进程(有意义,因为没有控制台)。子进程尝试访问stdin,这会导致错误。

另一种方法是对stdin使用/ dev / null,请参阅此主题以讨论如何执行此操作:Ignoring output from subprocess.Popen(除非您想在stdin上使用devnull)。