2011-10-19 4 views
3

J'ai essayé beaucoup de choses, mais pour une raison quelconque, je ne pouvais pas faire fonctionner les choses. J'essaye d'exécuter l'utilitaire de vidage de MS VS en utilisant un script Python.Pourquoi subprocess.Popen ne fonctionne pas

Voici ce que j'ai essayé (et ce qui ne fonctionne pas pour moi)

1.

tempFile = open('C:\\Windows\\temp\\tempExports.txt', 'w') 
command = '"C:/Program Files/Microsoft Visual Studio 8/VC/bin/dumpbin" /EXPORTS ' + dllFilePath 
process = subprocess.Popen(command, stdout=tempFile) 
process.wait() 
tempFile.close() 

2.

tempFile = open('C:\\Windows\\temp\\tempExports.txt', 'w') 
command = 'C:/Program Files/Microsoft Visual Studio 8/VC/bin/dumpbin /EXPORTS ' + dllFilePath 
process = subprocess.Popen(command, stdout=tempFile) 
process.wait() 
tempFile.close() 

3.

tempFile = open('C:\\Windows\\temp\\tempExports.txt', 'w') 
process = subprocess.Popen(['C:\\Program Files\\Microsoft Visual Studio 8\\VC\\bin\\dumpbin', '/EXPORTS', dllFilePath], stdout = tempFile) 
process.wait() 
tempFile.close() 

-t quelqu'un a une idée de faire ce que j'essaie faire (dumpbin /EXPORTS C:\Windows\system32\kernel32.dll > tempfile.txt) correctement en Python?

+1

Vous pouvez vouloir élaborer sur comment cela ne fonctionne pas. Avez-vous des messages d'erreur ou quoi que ce soit? –

+0

Avez-vous essayé ''C: \\ Program Files \\ Microsoft Visual Studio 8 \\ VC \\ bin \\ dumpbin.exe' '? – rumpel

+0

@rumpel yup, n'a pas fonctionné non plus. –

Répondre

3

Le modèle d'argument pour Popen prévoit une liste de chaînes pour les appels non shell et une chaîne pour les appels shell. C'est facile à réparer. Compte tenu:

>>> command = '"C:/Program Files/Microsoft Visual Studio 8/VC/bin/dumpbin" /EXPORTS ' + dllFilePath 

Soit appeler subprocess.Popen avec shell=True:

>>> process = subprocess.Popen(command, stdout=tempFile, shell=True) 

ou utiliser shlex.split pour créer une liste d'arguments:

>>> process = subprocess.Popen(shlex.split(command), stdout=tempFile) 
+0

essayé les deux, mais ne pouvait pas le faire fonctionner. btw dllpath est: 'C: \\ Windows \\ system32 \\ user32.dll', peut-être que ça aide .. –

+0

note 'shell = true' est considéré comme un risque de sécurité à partir de 2.7 – thundergolfer

+0

@thundergolfer Cela dépend entièrement de savoir si vous contrôlez la commande (comme dans la question de l'OP) ou d'une source externe non fiable: https://docs.python.org/2.7/library/subprocess.html#frequently-used-arguments –

1
with tempFile: 
    subprocess.check_call([ 
     r'C:\Program Files\Microsoft Visual Studio 8\VC\bin\dumpbin.exe', 
     '/EXPORTS', 
     dllFilePath], stdout=tempFile) 
+0

ok maintenant nous sommes sûrs que cela ne fonctionne pas :) subprocess.CalledProcessError: Commande '[' C: \\ Program Files \\ Microsoft Visual Studio 8 \\ VC \\ bin \\ dumpbin.exe ','/EXPORTS ',' C: \\ Windows \\ system32 \ \ user32.dll ']' a renvoyé l'état de sortie non-zéro -1073741515 –

+0

lorsque je fais ceci: subprocess.check_call ('"C: \\ Program Files \\ Microsoft Visual Studio 8 \\ VC \\ bin \\ dumpbin. exe "/ EXPORTS" + dllFilePath, stdout = tempFile, shell = True) le code de sortie est le même, mais après le débogage, j'ai découvert que dumpbin (o r cmd.exe) affiche le message suivant: 'Le nom du fichier, le nom du répertoire ou la syntaxe de l'étiquette de volume est incorrect.' et le débogage a montré que lorsque shell = True la commande qui est exécutée est: C: \ WINDOWS \ system32 \ cmd.exe/c "" \ C: \ Program Files \ Microsoft Visual Studio 8 \ VC \ bin \ dumpbin.exe \ "/ EXPORTS C: \ Fenêtre \ system32 \ user32.dll" " –