2009-10-06 20 views
6

私はPythonスクリプトからVisual Studioソリューションをビルドします。ビルド出力をキャプチャできないことを除いて、すべてうまく動作します。ここでPython、サブプロセス、devenv、なぜ出力がありませんか?

p = subprocess.Popen(['devenv', 'solution.sln', '/build'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
(out, err) = p.communicate() 
ret = p.returncode 

outerrの両方が常に空です。これは、p.returncodeに示すビルドの成功に関係なく発生します。

答えて

2

msbuild.exeでソリューションを構築する必要があります。このソリューションは、stdoutとstderrにフィードバックを提供するように設計されています。 msbuild.exemsbuild.exedevenv.exeのような/buildスイッチを取らないことを

注意(VS2005のソリューションを構築するために) またはC:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe(VS2008のソリューションを構築するために)

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msbuild.exeに位置しています。

+0

は有望で、チェックアウトしているようです... –

+0

これは質問ですが、私は他の人の利益のためにこれについてコメントしたいと思いました。はい、これはmsbuildで実現でき、とても良いツールです。しかし、VSセットアッププロジェクトをビルドするソリューションがある場合、msbuildはそれらのプロジェクトをビルドしません。私は私のソリューションのいくつかを構築し、サーバーと自分のアーカイブにセットアップを配布するPythonスクリプトを持っていますが、私はmsbuildを使用することができません。私はdevenv.comに試してみると、私はそのようなエラーを得ることができるかどうかを見て、それは私と私の状況にとって理想的だと思う。 – jlafay

0

おそらく、実行しているソフトウェアがstdoutまたはstderrに書き込まれていない可能性があります。多分それはwrites directly to the terminal/consoleです。

出力をキャプチャするには、win32 api callsが必要です。

+0

この場合、スクリプトを実行すると画面にビルド出力が表示されませんか? –

+0

@ギラード:わからない。たぶんあなたは自分でそれを印刷しなければなりません。 – nosklo

+0

出力をキャプチャする場合は、/ outフラグを使用して、ログファイルパスを指定します。ビルドイベントは、そのファイルに記録されます。 – jlafay

-2

おそらく、あなたの問題はパイプのバッファがいっぱいになることと同じです。良い答えはthis questionをチェックしてください。

+1

いいえ、その場合の問題はハングアップし、解決策はp.communicate()を使用することです。 OPはハングを経験せず、すでにp.communicate()を使用しています。 –

25

'devenv'から 'devenv.com'に変更してください。 Apparenty Popenはまず.EXEを探しますが、シェルはまず.COMを探します。 「devenv.com」への切り替えは私にとってうまくいった。

devenvは、インクリメンタルビルド用のmsbuildよりもはるかに高速です。私はちょうど最新のプロジェクトをビルドしました。何も起こらないはずです。

devenv 23秒 msbuild 55秒。

+0

私は、速度の違いは、 'devenv'はMSBuildが並列ビルドにならないということでした。 'msbuild/m'を実行すると、同様の速度が表示されます。 devenv.comの – kizzx2

+1

+1それが私のために働いたのです。 MSBUILDはVS 2010で使用できません。 –

関連する問題