Python - Sous-processus - Comment appeler une commande Piped sous Windows?
-
20-08-2019 - |
Question
Comment puis-je exécuter cette commande avec un 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:
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
Ce que j'ai remarqué:
- Exécuter la commande sur les fenêtres la console fonctionne bien.
- Si je retire le ECHO bosco | partie, il fonctionne bien le l'appel popen ci-dessus. Donc je pense ce problème est lié à l'écho ou |.
La solution
D'abord et avant tout, vous n'avez pas réellement 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 sous forme de chaîne; c'est désordonné dès que les noms de fichiers avec des espaces sont impliqués.
Troisièmement, si vous voulez vraiment exécuter une commande piped, appelez simplement le shell. Sous Windows, je pense que c'est cmd /c program name arguments | further stuff
.
Enfin, les barres obliques simples 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, uniquement 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')
Autres conseils
Vous aviez raison, le problème est ECHO. Sans l'option shell = True, la commande ECHO est introuvable.
Cela échoue avec l'erreur que vous avez vue:
subprocess.call(["ECHO", "Ni"])
Cela passe: affiche Ni et un 0
subprocess.call(["ECHO", "Ni"], shell=True)