2009-10-06 10 views
6

Creo una solución de Visual Studio a partir de un script de Python. Todo funciona bien, excepto que no puedo capturar la salida de compilación.Python, subproceso, devenv, ¿por qué no hay salida?

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

Aquí, tanto out y err son siempre vacío. Esto sucede independientemente del éxito de compilación como se ve en p.returncode.

Respuesta

2

En su lugar, debe compilar la solución con msbuild.exe, que está diseñado para enviar comentarios a stdout y stderr. msbuild.exe está situado en

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msbuild.exe (para construir una solución VS2005) o C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe (para construir una solución VS2008)

Tenga en cuenta que msbuild.exe No se necesita un interruptor /build como devenv.exe.

+0

parece prometedor, echándole un vistazo ... –

+0

Sé que esta es una pregunta, pero pensé que podría comentar sobre esto para el beneficio de otros. Sí, puedes lograr esto con msbuild y es una herramienta muy buena. Pero si tiene una solución que crea proyectos de configuración VS, msbuild NO construye esos proyectos. Tengo scripts de Python que crean algunas de mis soluciones y luego distribuyen las configuraciones a los servidores y a mi propio archivo, pero no puedo usar msbuild. Voy a probar devenv.com y ver si puedo obtener errores de esa manera y creo que eso sería ideal para mí y para mi situación. – jlafay

0

Eso es probablemente porque el software que está ejecutando no escribe en stdout o stderr. Tal vez es writes directly to the terminal/console.

Si ese es el caso, necesitará un win32 api calls para capturar la salida.

+0

En este caso, ¿no vería la salida de compilación en la pantalla cuando ejecuto mi script? –

+0

@Gilad: No lo sé. Tal vez tengas que imprimirlo tú mismo. – nosklo

+0

Si desea capturar el resultado, puede usar el indicador/out y seguirlo con una ruta de archivo de registro. Los eventos de compilación se registran en ese archivo. – jlafay

-2

Probablemente su problema es el mismo que el buffer de la tubería se llena. Consulte this question para obtener una buena respuesta.

+1

No, el problema en ese caso sería un bloqueo, y la solución es usar p.communicate(). El OP no experimenta un bloqueo y ya usa p.communicate(). –

25

Cambiar de 'devenv' a 'devenv.com'. Aparentemente, Popen busca primero los .EXE, pero el intérprete de comandos busca .COMs primero. Cambiar a 'devenv.com' funcionó para mí.

devenv es significativamente más rápido que msbuild para compilaciones incrementales. Acabo de hacer una compilación con un proyecto actualizado, lo que significa que no debería pasar nada.

devenv 23 segundos msbuild 55 segundos.

+0

Creo que la diferencia de velocidad fue que 'devenv' por defecto está en construcción paralela donde MSBuild no está. Pruebe 'msbuild/m' y debería ver una velocidad similar. – kizzx2

+1

+1 para devenv.com. Eso es lo que funcionó para mí. MSBUILD no está disponible para VS 2010. –

Cuestiones relacionadas