2009-10-06 3 views
6

Je construis une solution Visual Studio à partir d'un script Python. Tout fonctionne bien, sauf que je suis incapable de capturer la sortie de construction.Python, sous-processus, devenv, pourquoi pas de sortie?

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

Ici, les deux out et err sont toujours vides. Cela se produit quel que soit le succès de la génération, comme illustré dans p.returncode.

Répondre

2

Vous devez plutôt créer la solution avec msbuild.exe, qui est conçue pour fournir des commentaires à stdout et stderr. msbuild.exe est situé à

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msbuild.exe (pour construire une solution VS2005) ou C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe (pour construire une solution VS2008)

Notez que msbuild.exe ne prend pas un interrupteur /build comme devenv.exe.

+0

semble prometteur, en vérifiant ... –

+0

Je sais que c'est une question mais j'ai pensé que je commenterais cela pour le bénéfice des autres. Oui, vous pouvez accomplir cela avec msbuild et c'est un très bon outil. Mais si vous avez une solution qui construit des projets d'installation VS, msbuild ne construit PAS ces projets. J'ai des scripts python qui construisent certaines de mes solutions, puis distribuent les configurations aux serveurs et à mes propres archives mais je ne peux pas utiliser msbuild. Je vais essayer devenv.com et voir si je peux avoir des erreurs de cette façon et je pense que ce serait idéal pour moi et ma situation. – jlafay

0

C'est probablement parce que le logiciel que vous utilisez n'écrit pas stdout ou stderr. Peut-être writes directly to the terminal/console.

Si c'est le cas, vous aurez besoin de win32 api calls pour capturer la sortie.

+0

Dans ce cas, est-ce que je ne vois pas la sortie de construction sur l'écran lorsque je cours mon script? –

+0

@Gilad: Je ne sais pas. Peut-être que vous devez l'imprimer vous-même. – nosklo

+0

Si vous souhaitez capturer la sortie, vous pouvez utiliser le drapeau/out avec et le suivre avec un chemin de fichier journal. Les événements de génération sont ensuite consignés dans ce fichier. – jlafay

-2

Votre problème est probablement le même que celui du tampon du tuyau. Vérifiez this question pour une bonne réponse.

+1

Non, le problème dans ce cas serait un blocage, et la solution consiste à utiliser p.communicate(). L'OP ne subit pas de blocage et utilise déjà p.communicate(). –

25

Passez de 'devenv' à 'devenv.com'. Apparemment, Popen recherche les .EXE en premier, mais le shell recherche les .COM en premier. Passer à 'devenv.com' a fonctionné pour moi. Devenv est significativement plus rapide que msbuild pour les builds incrémentaux. Je viens de faire une construction avec un projet à jour, ce qui signifie que rien ne devrait arriver.

devenv 23 secondes msbuild 55 secondes.

+0

Je crois que la différence de vitesse était que 'devenv' prend par défaut la construction parallèle où MSBuild ne l'est pas. Essayez 'msbuild/m' et vous devriez voir une vitesse similaire. – kizzx2

+1

+1 pour devenv.com. C'est ce qui a fonctionné pour moi. MSBUILD n'est pas disponible pour VS 2010. –

Questions connexes