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 dernier, stable.
Des idées?
Merci,
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 dernier, stable.
Des idées?
Merci,
Réponses:
Lorsque la commande est un shell intégré, ajoutez un 'shell = True' à l'appel.
Par exemple pour dir
vous tapez:
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 la console.
dir.exe
alors qu'il y a un /bin/ls
in * nix. dir
est implémenté par CMD.EXE tout comme cd
est implémenté par bash .
PATH
depuis le os.environ
et de le rechercher manuellement.
Sous Windows, je crois que le subprocess
module ne regarde pas dans le PATH
sauf si vous passezshell=True
car il est utilisé CreateProcess()
dans les coulisses. Cependant, cela shell=True
peut représenter un risque pour la sécurité si vous transmettez des arguments qui peuvent provenir de l'extérieur de votre programme. Pour subprocess
pouvoir néanmoins trouver le bon exécutable, vous pouvez utiliser shutil.which
. Supposons que l'exécutable dans votre PATH
soit nommé frob
:
subprocess.call([shutil.which('frob'), arg1, arg2])
(Cela fonctionne sur Python 3.3 et supérieur.)
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 séparés.
par exemple
subprocess.call(['cmd', '/c', 'dir'])
/ c dit à cmd d'exécuter la commande suivante
C'est plus sûr que d'utiliser shell = True, qui permet les injections shell.
/k
plutôt que /c
. Entrez cmd /?
sur la ligne de commande pour plus de détails.
Si vous utilisez PowerShell, alors ce sera subprocess.call(['powershell','-command','dir'])
. Powershell prend en charge une grande partie des commandes POSIX
Après avoir beaucoup gratté la tête, j'ai découvert que l'exécution d'un fichier situé dans C: \ Windows \ System32 \ tout en exécutant une version 32 bits de python sur une machine 64 bits est un problème potentiel, car Windows tente de surpasser le processus, et redirigez les appels vers C: \ Windows \ System32 vers C: \ Windows \ SysWOW64.
J'ai trouvé un exemple de résolution de ce problème ici: http://code.activestate.com/recipes/578035-disable-file-system-redirector/
Pour citer la documentation:
"Avant Python 3.5, ces trois fonctions comprenaient l'API de haut niveau à sous-traiter. Vous pouvez désormais utiliser run () dans de nombreux cas, mais beaucoup de code existant appelle ces fonctions."
SO: au lieu de subprocess.call, utilisez subprocess.run pour Python 3.5 et supérieur
J'ai rencontré le même problème pendant que j'appelais un PHP. La raison est que PHP n'est pas dans PATH, donc la commande PHP n'a pas été trouvée. Mais PowerShell a trouvé qu'il existe à l'emplacement actuel et il suggère de remplacer le 'PHP' par le '. \ PHP' si je fais confiance à cette commande. Ensuite, ça marche bien.