我有一个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)中显示命令提示符的所有输出?
答案 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()调用将允许文本控件实时更新。否则,它会在子进程完成后更新。