1

msbuild を使用してプロジェクトをビルドするスクリプトを開発しました。ユーザーがクリックするとmsbuildを使用してプロジェクトをビルドするボタンがあるwxpythonを使用してGUIを開発しました。ここで、ユーザーがそのボタンをクリックしたときにステータス ウィンドウを開き、コマンド プロンプトに表示されるすべての出力を表示する必要があります。つまり、コマンド プロンプト出力をユーザー 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 /

基本的に、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に「印刷」(つまりリダイレクト)することができます。これがないと、コマンドが終了するまでテキストは表示されません。すべてが理にかなっていることを願っています。

于 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 に答える