在python的单独窗口中读取命令提示输出

时间:2013-03-04 10:06:34

标签: python-2.7 wxpython

我有一个python脚本,它在windows系统上使用msbuild构建一个解决方案文件。我想在构建过程运行时显示命令提示输出。我的代码如下所示

def build(self,projpath):
    if not os.path.isfile(self.msbuild):
        raise Exception('MSBuild.exe not found. path=' + self.msbuild)

    arg1 = '/t:Rebuild'
    arg2 = '/p:Configuration=Release'
    p = subprocess.call([self.msbuild,projpath,arg1,arg2])
    print p
    if p==1:
        return False
    return True

我能够构建文件,但我需要在单独的GUI(状态窗口)中显示构建状态。我尝试了很多将命令提示符输出重定向到文件,然后从文件中读取但是,可以没有成功。 我试过下面的命令,

subprocess.check_output('subprocess.call([self.msbuild,projpath,arg1,arg2])', shell=False) > 'C:\tmp\file.txt'

任何人都可以告诉我如何在运行脚本时在状态窗口(使用wxpython的GUI)中显示命令提示符的所有输出?

1 个答案:

答案 0 :(得分:4)

当我想用wxPython捕获traceroute和ping命令时,我做了类似的事情。我在本教程中写到了这一点:http://www.blog.pythonlibrary.org/2010/06/05/python-running-ping-traceroute-and-more/

首先,你需要redirect stdout,基本上是这样的:

redir=RedirectText(log)
sys.stdout=redir

其中RedirectText是一个接受wx.TextCtrl作为参数的特殊类。见下文:

class RedirectText(object):
    def __init__(self,aWxTextCtrl):
        self.out=aWxTextCtrl

    def write(self,string):
        self.out.WriteText(string)

这是我的ping命令的一个例子:

proc = subprocess.Popen("ping %s" % ip, shell=True, 
                        stdout=subprocess.PIPE) 
print
while True:
    line = proc.stdout.readline()                        
    wx.Yield()
    if line.strip() == "":
        pass
    else:
        print line.strip()
    if not line: break
proc.wait()

因此,您只需运行子进程并使用其readline函数在输出时获取数据。然后将输出打印到stdout,重定向到文本控件。 wx.Yield()调用将允许文本控件实时更新。否则,它会在子进程完成后更新。