2009-06-26 5 views
6

Mise à jour: Lorsque j'utilise le subprocess.call au lieu de subprocess.Popen, le problème est résolu - Quelqu'un sait-il ce qui est la cause? Et il est venu un autre problème: je n'arrive pas à trouver un moyen de contrôler la sortie ... Y at-il un moyen de rediriger la sortie de subprocess.call vers une chaîne ou quelque chose comme ça? Merci!Quand j'écris un script python pour exécuter Devenv avec configure « Debug | Win32 » il ne fait rien

Je suis en train d'utiliser Devenv pour construire des projets, et il fonctionne très bien quand je tape dans l'invite de commande comme devenv A.sln /build "Debug|Win32" - mais quand j'utilise un python pour l'exécuter en utilisant Popen(cmd,shell=true)cmd est la même ligne que ci-dessus, ça ne montre rien. Si je supprime le |, changez-le pour "Debug" seulement, cela fonctionne ....

Est-ce que quelqu'un sait pourquoi cela se produit? Je l'ai essayé de mettre un \ avant |, mais rien ne se passe ..

Ce code J'utilise:

from subprocess import Popen, PIPE 

cmd = ' "C:\\Program Files\\Microsoft Visual Studio 8\\Common7\\IDE\\devenv" solution.sln /build "Debug|Win32" ' 

sys.stdout.flush() 
p = Popen(cmd,shell=True,stdout=PIPE,stderr=PIPE) 
lines = [] 
for line in p.stdout.readlines(): 
    lines.append(line) 
out = string.join(lines) 
print out 
if out.strip(): 
    print out.strip('\n') 
    sys.stdout.flush() 

... qui ne fonctionne pas, cependant, si j'échange Debug|Win32 avec Debug, cela fonctionne parfaitement ..

Merci pour tous les commentaires ici

+0

Juste une intuition qui est apparue dans ma tête, quelle note avez-vous utilisée/pouvez-vous afficher la déclaration d'importation? –

+0

Bien sûr, il est: de Popen import subprocess, PIPE p = Popen (cmd, shell = True, stdout = PIPE, stderr = PIPE) où cmd est quelque chose comme « .. (chemin)/devenv" solution/build "Debug | Win32" ... il semble que le | signe rend l'ensemble de la commande étant ignoré ... –

+0

J'ai découvert que créer un fichier compile.bat à la volée en Python, qui contient toute la commande 'devenv.com', puis en exécutant compile.bat à partir de Python en utilisant' Popen' fonctionne comme un charme. –

Répondre

0

Lorsque shell = False est utilisé, il traitera la chaîne comme une seule commande, de sorte que vous devez passer la commande/arugments comme une liste .. Quelque chose comme:

from subprocess import Popen, PIPE 

cmd = [ 
    r"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv", # in raw r"blah" string, you don't need to escape backslashes 
    "solution.sln", 
    "/build", 
    "Debug|Win32" 
] 

p = Popen(cmd, stdout=PIPE, stderr=PIPE) 
out = p.stdout.read() # reads full output into string, including line breaks 

print out 
+0

En fait, la liste des arguments ne fonctionne pas pour moi - quand je l'exécute, elle continue de montrer la boîte de dialogue d'aide de devenv, ce qui signifie que seul le premier argument a été appelé. Cependant, vous avez un bon sens avec l'argument shell - il s'est avéré que je désactivais le shell = True, la ligne de commande d'origine fonctionne parfaitement. Il doit y avoir une signification différente pour | avec l'option shell je suppose. Merci et à bientôt! –

0

Essayez de double citant comme: 'devenv A.sln/build "Debug | Win32"'

+0

J'ai fait double citation réellement .. –

0

On dirait que le shell de Windows prend ce | comme un tuyau (malgré les guillemets et les échappements). Avez-vous essayé shell=False à la place?

+0

Quand je place Shell à False, je ne peux pas sembler avoir une sortie donc je ne peux pas m'assurer si ça marche ou pas. Pouvez-vous me dire comment obtenir une sortie quand shell = False? Merci –

+0

C'est un mystère - s'il vous plaît nous montrer tout l'extrait de code, sinon il restera sans doute un ;-). –

+0

Il s'est avéré que c'est l'option shell qui a causé le problème. Je ne sais pas pourquoi je n'ai pas pu obtenir la sortie au début. Merci!! –

4

Il y a une différence entre devenv.exe et devenv.com, les deux sont exécutables et vivent dans le même répertoire (soupir). Les lignes de commande utilisées dans la question et certaines réponses ne disent pas ce qu'elles veulent, donc je ne suis pas sûr de savoir qui va être utilisé. Si vous souhaitez appeler à partir de la ligne de commande, vous devez vous assurer que vous utilisez devenv.com, sinon vous risquez d'obtenir une interface graphique surgissante. Je pense que cela pourrait être la cause de certaines (mais pas toutes) de la confusion.

+2

cela a fonctionné pour moi. J'ai changé 'devenv' ci-dessus pour 'devenv.com' et tout a commencé à fonctionner. – gman

1

Voir la section 17.1.5.1. dans la documentation python.

Sous Windows, Python ajoute automatiquement les guillemets doubles autour de l'argument de configuration du projet. I.e Debug | win32 est transmis en tant que "Debug | win32" à devenv. Vous n'avez pas besoin d'ajouter les guillemets et vous n'avez PAS besoin de passer shell = True à Popen.

Utilisez ProcMon pour afficher la chaîne d'argument transmise à devenv.

Questions connexes