2012-04-24 66 views
11

工作,我希望能够在我使用Windows上运行下面的脚本来获得输出和错误的内容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() 

当我使用python它执行.exe我得到预期的输出。当我运行它使用pythonw.exe 我最终在异常方面。如果我只用命令和startupinfo标志运行popen命令将成功完成,但不能访问子进程中的数据。我读过的所有内容都表明这应该起作用,但必须缺少一些东西。任何帮助将不胜感激。

感谢, 兰迪

+0

您是否碰巧记录异常信息? – jdi 2012-04-24 06:04:15

+0

我已经尝试过但并不成功。这很容易复制,所以关于如何获得异常信息的任何想法,并会给它一个 – user1352650 2012-04-25 02:22:44

+0

我不明白。你的代码碰到了一个通用的块,但你不能告诉我们这个异常?将其更改为:“除异常,e”并记录e。或者只是在最后提高,所以你可以看到错误是什么 – jdi 2012-04-25 14:31:37

回答

10

使用pythonw.exe时

pythonw.exe开始不具有标准的文件描述符正常访问的守护进程,这可能是一个错误。你需要在你的脚本做的唯一一件事情就是专门设置stdin的第三FD:(后期这个答案几年...)

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

该链接给出了一个404 :( – msiemens 2013-09-17 11:33:20

4

我经历了同样的问题跑,发现你应该更换此:

标准输出= subprocess.PIPE

与此:

标准输入=子process.PIPE

这是我对基本问题的猜测:pythonw启动没有标准输入(有意义,因为没有控制台)的过程。该子进程尝试访问stdin,并导致错误。

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

+0

你可能会晚几年答案,但它仍然帮助我:) – 2015-06-29 10:59:29