2009-10-06 66 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替代解決方案,其目的是提供反饋給輸出和錯誤。 msbuild.exe位於

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msbuild.exe(構建VS2005溶液) 或C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe(構建VS2008溶液)

注意msbuild.exe並不需要/build開關等devenv.exe

+0

看起來很有前途,檢查出來...... – 2009-10-06 14:05:13

+0

我知道這是一個問題,但我認爲我會評論這對他人的好處。是的,你可以用msbuild來完成這件事,它是一個非常好的工具。但是如果你有一個解決方案來構建VS安裝項目,msbuild不會構建這些項目。我有python腳本構建我的一些解決方案,然後分發設置到服務器和我自己的存檔,但我無法使用msbuild。我會嘗試給devenv.com一個試試看看我能否以這種方式獲得錯誤,我認爲這對我和我的情況來說都是理想的。 – jlafay 2012-03-29 12:55:38

0

這可能是因爲您正在運行的軟件不寫stdoutstderr。也許它writes directly to the terminal/console

如果是這樣的話,你會需要一些win32 api calls捕獲輸出。

+0

在這種情況下,當我運行腳本時,屏幕上是否會顯示生成輸出? – 2009-10-06 13:52:21

+0

@吉拉德:我不知道。也許你必須自己打印回來。 – nosklo 2009-10-06 22:37:34

+0

如果要捕獲輸出,可以使用/ out標誌並按照日誌文件路徑進行操作。構建事件然後記錄到該文件。 – jlafay 2012-03-29 12:59:12

-2

也許你的問題是相同的,該管道緩衝區填滿。檢查this question是一個很好的答案。

+1

不,這種情況下的問題將是一個掛起,並且解決方案是使用p.communicate()。 OP不會遇到掛起並已經使用p.communicate()。 – 2009-10-06 14:17:35

25

將其從'devenv'更改爲'devenv.com'。顯然,Popen首先尋找.EXE,但shell首先尋找.COMs。切換到'devenv.com'爲我工作。

devenv比增量構建的msbuild快得多。我只是做了一個最新的項目,意味着什麼都不應該發生。

devenv的23秒 的msbuild 55秒。

+0

我相信速度差異是'devenv'默認並行版本,而MSBuild不是。試試'msbuild/m',你會看到類似的速度。 – kizzx2 2011-01-17 17:54:49

+1

+1爲devenv.com。這對我來說很有用。 MSBUILD不適用於VS 2010。 – 2013-09-06 16:54:02