Python - sous-processus - Comment appeler une canalisation de commande dans Windows?
Comment puis-je exécuter cette commande avec des sous-processus?
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 j'ai reçu:
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é:
- L'exécution de la commande sur le windows
la console fonctionne très bien. - Si je supprime le
ECHO bosco| partie, il fonctionne très bien la
le popen l'appel ci-dessus. Donc je pense que
ce problème est lié à l'écho ou
|.
- Ne que ligne complète en fait le travail lorsque vous exécutez dans la console Windows? WindowsError suggère que le problème n'est pas de votre code Python, mais la commande à exécuter.
- Oui, il fonctionne à partir de windows dos de la console.
Vous devez vous connecter pour publier un commentaire.
D'abord et avant tout, vous n'avez pas réellement besoin d'un tuyau; vous venez d'envoyer d'entrée. Vous pouvez utiliser sous-processus.communiquer pour que.
Deuxièmement, ne pas spécifier la commande comme une chaîne de caractères; c'est le désordre dès que les noms de fichiers avec des espaces sont impliqués.
Troisièmement, si vous avez vraiment voulu exécuter une canalisation de commande, il suffit d'appeler le shell. Sur Windows, je crois que c'est
cmd /c program name arguments | further stuff
.Enfin, seul des barres obliques inverses peuvent être dangereux:
"\p"
est'\\p'
, mais'\n'
est une nouvelle ligne. Utilisation os.chemin d'accès.join() ou os.sep ou, si elle est spécifiée à l'extérieur de python, juste une barre oblique.Vous avez eu raison, l'ÉCHO est le problème. Sans le shell=True option de la commande ECHO ne peut pas être trouvé.
Cela échoue avec l'erreur que vous avez vu:
Ce passe: imprime Ni et un 0
subprocess.call("ECHO Ni", shell=True)
? etsubprocess.call(["ECHO", "Ni"])
fonctionne très bien pour moi.