Construyo 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.

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

Aquí, tanto out como err siempre están vacíos. Esto sucede independientemente del éxito de la compilación como se ve en p.returncode.

6
Gilad Naor 6 oct. 2009 a las 17:46

4 respuestas

La mejor respuesta

En su lugar, debe compilar la solución con msbuild.exe, que está diseñada para dar retroalimentación a stdout y stderr. msbuild.exe se encuentra 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 requiere un cambio /build como devenv.exe.

2
Wim Coenen 6 oct. 2009 a las 13:58

Probablemente su problema sea el mismo que el búfer de la tubería se llena. Marque esta pregunta para una buena respuesta.

-2
Community 23 may. 2017 a las 12:17

Probablemente sea porque el software que está ejecutando no escribe en stdout o stderr. Tal vez escribe directamente en el terminal / consola.

Si ese es el caso, necesitará algunas llamadas win32 api para capturar la salida.

0
nosklo 6 oct. 2009 a las 13:50

Cámbielo de 'devenv' a 'devenv.com'. Aparentemente, Popen busca .EXEs primero pero el shell 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.

26
gman 29 oct. 2009 a las 20:04