1

开发了一个使用 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
4

2 回答 2

4

实际上,我几年前在我的博客上写过这个,在那里我创建了一个脚本来将 ping 和 traceroute 重定向到我的 wxPython 应用程序:http: //www.blog.pythonlibrary.org/2010/06/05/python-running-ping -traceroute-and-more/

基本上,您创建一个简单的类来将标准输出重定向到并传递给它一个 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 允许文本“打印”(即重定向)到标准输出。没有它,在命令完成之前文本不会显示。我希望这一切都说得通。

于 2013-03-18T14:44:18.897 回答
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() 
于 2013-03-22T04:52:12.317 回答