web-dev-qa-db-fra.com

Windows ne trouve pas le fichier sur subprocess.call ()

Je reçois l'erreur suivante:

WindowsError: [Error 2] The system cannot find the file specified

Mon code est:

subprocess.call(["<<executable file found in PATH>>"])

Windows 7, 64 bits. Python 3.x dernière version, stable.

Des idées?

Merci,

84
Sri

Lorsque la commande est un shell intégré, ajoutez un 'Shell = True' à l'appel.

Par exemple. pour dir vous devez taper:

import subprocess
subprocess.call('dir', Shell=True)

Pour citer la documentation:

Le seul moment où vous devez spécifier Shell = True sous Windows est lorsque la commande que vous souhaitez exécuter est intégrée au shell (par exemple, dir ou copy). Vous n'avez pas besoin de Shell = True pour exécuter un fichier de commandes ou un exécutable basé sur une console.

152
Douglas Macdonald

Sous Windows, je pense que le module subprocess ne regarde pas dans le PATH à moins que vous ne transmettiez Shell=True. Toutefois, Shell=True peut représenter un risque pour la sécurité si vous transmettez des arguments pouvant provenir de l’extérieur de votre programme. Pour que subprocess puisse néanmoins trouver le bon exécutable, vous pouvez utiliser shutil.which . Supposons que l'exécutable de votre PATH s'appelle frob:

subprocess.call([shutil.which('frob'), arg1, arg2])

(Cela fonctionne sur Python 3.3 et plus.)

21
ptomato

Sous Windows, vous devez appeler via cmd.exe. Comme Apalala l'a mentionné, les commandes Windows sont implémentées dans cmd.exe et non en tant qu'exécutables distincts.

par exemple.

subprocess.call(['cmd', '/c', 'dir'])

/ c indique à cmd d'exécuter la commande suivante

Ceci est plus sûr que d’utiliser Shell = True, qui autorise les injections de Shell.

13
Sam Inverso

Si vous utilisez PowerShell, alors il y aura subprocess.call(['powershell','-command','dir']). Powershell prend en charge une grande partie des commandes POSIX

2
Darksnake

Pour citer la documentation:

"Avant Python 3.5, ces trois fonctions constituaient l’API de haut niveau du sous-processus. Vous pouvez maintenant utiliser run () dans de nombreux cas, mais de nombreux codes existants appellent ces fonctions."

SO: au lieu de subprocess.call, utilisez subprocess.run pour Python 3.5 et supérieur

0
Adrian Berca