Quand j'écris un script python pour exécuter Devenv avec configure « Debug | Win32 » il ne fait rien

StackOverflow https://stackoverflow.com/questions/1049784

  •  20-08-2019
  •  | 
  •  

Question

Mise à jour: Quand j'utilise au lieu de la subprocess.call subprocess.Popen, le problème est résolu - Quelqu'un sait-il ce qui est la cause? Et il y eut un autre problème: je ne peux pas sembler trouver un moyen de contrôler la sortie ... Est-il possible de rediriger la sortie vers une chaîne Devenv ou quelque chose comme ça? Merci!

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

Quelqu'un sait-il pourquoi cela se produit? Je l'ai essayé de mettre un avant Debug|Win32 Debug, mais rien ne se passe ..

est le code que je 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 avec <=> <=>, cela fonctionne parfaitement ..

Merci pour tous les commentaires ici

Était-ce utile?

La solution

Quand est utilisé shell = False, il traitera la chaîne comme une seule commande, vous devez donc 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

Autres conseils

Il y a une différence entre et devenv.exe devenv.com, qui sont tous deux exécutables et vivent dans le même répertoire (soupir). Les lignes de commande utilisées dans la question et des réponses ne disent pas qu'ils veulent donc je ne suis pas sûr de vous habituerez.

Si vous voulez appeler à partir de la ligne de commande, vous devez vous assurer que vous utilisez <=>, sinon vous êtes susceptible d'obtenir une interface graphique popping up. Je pense que cela pourrait être la cause de certains (mais pas tous) de la confusion.

Voir la section 17.1.5.1. dans la documentation python.

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

Utilisez ProcMon pour afficher la chaîne argument passé à devenv.

Essayez de double citer comme: «devenv A.sln / build "Debug | Win32"

On dirait que le shell Windows prend que comme un tuyau | (malgré les citations et les évasions). Avez-vous essayé la place shell=False?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top