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