2009-10-06 16 views
6

Costruisco una soluzione di Visual Studio da uno script Python. Tutto funziona bene, tranne che non riesco a catturare l'output della build.Python, sottoprocesso, devenv, perché nessun output?

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

Qui, sia out e err sono sempre vuoto. Ciò accade indipendentemente dal successo della build come mostrato in p.returncode.

risposta

2

Si dovrebbe invece creare la soluzione con msbuild.exe, che è progettata per fornire un feedback a stdout e stderr. msbuild.exe si trova a

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msbuild.exe (per costruire una soluzione VS2005) o C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe (per costruire una soluzione VS2008)

noti che msbuild.exe non ci vuole un interruttore /build come devenv.exe.

+0

sembra promettente, check it out ... –

+0

So che questa è una domanda ma ho pensato di commentare questo a beneficio degli altri. Sì, puoi farlo con msbuild ed è uno strumento molto carino. Ma se hai una soluzione che costruisce progetti di installazione VS, msbuild NON costruisce quei progetti. Ho degli script Python che costruiscono alcune delle mie soluzioni e quindi distribuiscono le configurazioni ai server e al mio archivio personale, ma non sono in grado di utilizzare msbuild. Ho intenzione di dare a devenv.com una prova e vedere se riesco a ottenere errori in questo modo e penso che sarebbe l'ideale per me e la mia situazione. – jlafay

0

Ciò è probabilmente dovuto al fatto che il software in esecuzione non scrive su stdout o stderr. Forse è writes directly to the terminal/console.

Se questo è il caso, è necessario un po 'di win32 api calls per acquisire l'output.

+0

In questo caso, non visualizzerò l'output di generazione sullo schermo quando eseguo il mio script? –

+0

@ Gilil: non lo so. Forse devi stamparlo da solo. – nosklo

+0

Se si desidera acquisire l'output, è possibile utilizzare il flag/out e seguirlo con un percorso del file di registro. Gli eventi di compilazione vengono quindi registrati su quel file. – jlafay

-2

Probabilmente il tuo problema è lo stesso che il buffer della pipa si riempie. Controlla this question per una buona risposta.

+1

No, il problema in quel caso sarebbe un blocco e la soluzione è usare p.communicate(). L'OP non subisce un blocco e utilizza già p.communicate(). –

25

Cambiarlo da "devenv" a "devenv.com". Apparenty Popen cerca prima .EXEs, ma la shell cerca prima .COM. Passare a "devenv.com" ha funzionato per me.

devenv è significativamente più veloce di msbuild per le build incrementali. Ho appena fatto una build con un progetto aggiornato, il che significa che non dovrebbe accadere nulla.

devenv 23 secondi msbuild 55 secondi.

+0

Credo che la differenza di velocità fosse che il 'devenv' si imposta automaticamente in parallelo dove MSBuild non lo è. Prova 'msbuild/m' e dovresti vedere velocità simile. – kizzx2

+1

+1 per devenv.com. Questo è quello che ha funzionato per me. MSBUILD non è disponibile per VS 2010. –

Problemi correlati