2009-06-25 8 views
5

Comment exécuter cette commande avec un sous-processus?Python - Sous-processus - Comment appeler une commande Piped dans Windows?

J'ai essayé:

proc = subprocess.Popen(
    '''ECHO bosco|"C:\Program Files\GNU\GnuPG\gpg.exe" --batch --passphrase-fd 0 --output "c:\docume~1\usi\locals~1\temp\tmptlbxka.txt" --decrypt "test.txt.gpg"''', 
    stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.STDOUT, 
) 
stdout_value, stderr_value = proc.communicate() 

mais a obtenu:

Traceback (most recent call last): 
... 
    File "C:\Python24\lib\subprocess.py", line 542, in __init__ 
    errread, errwrite) 
    File "C:\Python24\lib\subprocess.py", line 706, in _execute_child 
    startupinfo) 
WindowsError: [Errno 2] The system cannot find the file specified 

choses que j'ai remarqué:

  1. exécution de la commande sur les fenêtres console fonctionne très bien. Si je retire le ECHO bosco | partie, il fonctionne bien le l'appel popen ci-dessus. Donc, je pense que ce problème est lié à l'écho ou |.
+0

Est-ce que la ligne complète fonctionne effectivement lorsque vous exécutez dans la console Windows? WindowsError suggère que le problème n'est pas votre code Python, mais la commande à exécuter. –

+0

Oui, il fonctionne à partir de la console Windows dos. – Greg

Répondre

11

D'abord et avant tout, vous n'avez pas vraiment besoin d'un tuyau; vous envoyez juste une entrée. Vous pouvez utiliser subprocess.communicate pour cela.

Deuxièmement, ne spécifiez pas la commande en tant que chaîne; c'est désordonné dès que les noms de fichiers avec des espaces sont impliqués. Troisièmement, si vous vouliez vraiment exécuter une commande canalisée, appelez simplement le shell. Sur Windows, je crois que c'est cmd /c program name arguments | further stuff. Enfin, les barres obliques peuvent être dangereuses: "\p" est '\\p', mais '\n' est une nouvelle ligne. Utilisez os.path.join() ou os.sep ou, si spécifié en dehors de python, juste une barre oblique.

proc = subprocess.Popen(
    ['C:/Program Files/GNU/GnuPG/gpg.exe', 
    '--batch', '--passphrase-fd', '0', 
    '--output ', 'c:/docume~1/usi/locals~1/temp/tmptlbxka.txt', 
    '--decrypt', 'test.txt.gpg',], 
    stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.STDOUT, 
) 
stdout_value, stderr_value = proc.communicate('bosco') 
+0

Merci, ça a marché! – Greg

4

Vous aviez raison, l'ECHO est le problème. Sans l'option shell = True, la commande ECHO est introuvable.

Cela échoue avec l'erreur que vous avez vu:

subprocess.call(["ECHO", "Ni"]) 

Ceci passe: imprime Ni et 0

subprocess.call(["ECHO", "Ni"], shell=True) 
+0

en fait, ne devrait-il pas être 'subprocess.call (" ECHO Ni ", shell = True)'? et 'subprocess.call ([" ECHO "," Ni "])' fonctionne très bien pour moi. – Chris

+0

Vous pouvez utiliser l'un ou l'autre mais selon le document [Popen Constructor] (https://docs.python.org/3/library/subprocess.html#popen-constructor) docs: "Sauf indication contraire, il est recommandé de passer des arguments comme une séquence. " –

Questions connexes