开发了一个使用msbuild构建项目的脚本。我使用wxpython开发了GUI,它有一个按钮,当用户点击时可以使用msbuild构建项目。现在,我想在用户单击该按钮时打开一个状态窗口,并显示在命令提示符和命令提示符下显示的所有输出,不应显示,即将命令提示符输出重定向到用户GUI状态窗口。我的构建脚本是,
def build(self,projpath)
arg1 = '/t:Rebuild'
arg2 = '/p:Configuration=Release'
arg3 = '/p:Platform=x86'
p = subprocess.call([self.msbuild,projpath,arg1,arg2,arg3])
if p==1:
return False
return True
答案 0 :(得分:4)
几年前我在博客上写了这篇文章,我创建了一个脚本,将ping和traceroute重定向到我的wxPython应用程序:http://www.blog.pythonlibrary.org/2010/06/05/python-running-ping-traceroute-and-more/
基本上,您创建了一个简单的类来重定向stdout并将其传递给TextCtrl的一个实例。最终看起来像这样:
class RedirectText:
def __init__(self,aWxTextCtrl):
self.out=aWxTextCtrl
def write(self,string):
self.out.WriteText(string)
然后当我写下ping命令时,我这样做了:
def pingIP(self, ip):
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()
要看的主要内容是子进程调用中的stdout参数,而wx.Yield()也很重要。 Yield允许文本被“打印”(即重定向)到stdout。没有它,文本将在命令完成后才会显示。我希望这一切都有道理。
答案 1 :(得分:1)
我做了如下改动,它对我有用。
def build(self,projpath):
arg1 = '/t:Rebuild'
arg2 = '/p:Configuration=Release'
arg3 = '/p:Platform=Win32'
proc = subprocess.Popen(([self.msbuild,projpath,arg1,arg2,arg3]), 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()