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é:

  1. Exécuter la commande sur les fenêtres la console fonctionne bien.
  2. 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 |.
Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top