Estoy teniendo el siguiente error:
WindowsError: [Error 2] The system cannot find the file specified
Mi codigo es:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64 bits. Python 3.x más reciente, estable.
¿Algunas ideas?
Gracias,
python
path
python-3.x
Sri
fuente
fuente
Respuestas:
Cuando el comando es un shell incorporado, agregue un 'shell = True' a la llamada.
Por ejemplo, para
dir
ti escribirías:Para citar de la documentación:
fuente
dir.exe
mientras hay un/bin/ls
in * nix. CMD.EXE lodir
implementa de forma muy similar a como lo implementa bash .cd
PATH
deos.environ
y buscarlo manualmente.En Windows, creo que el
subprocess
módulo no se ve en el aPATH
menos que paseshell=True
porque se usaCreateProcess()
detrás de escena. Sin embargo,shell=True
puede ser un riesgo para la seguridad si pasa argumentos que pueden provenir de fuera de su programa. Nosubprocess
obstante, para poder encontrar el ejecutable correcto, puede utilizarshutil.which
. Suponga que el ejecutable en suPATH
se llamafrob
:(Esto funciona en Python 3.3 y superior).
fuente
En Windows, debe llamar a través de cmd.exe. Como mencionó Apalala, los comandos de Windows se implementan en cmd.exe no como ejecutables separados.
p.ej
/ c le dice a cmd que ejecute el comando de seguimiento
Esto es más seguro que usar shell = True, que permite inyecciones de shell.
fuente
/k
lugar de/c
. Ingresecmd /?
en la línea de comando para obtener más detalles.Si está usando powershell, entonces estará
subprocess.call(['powershell','-command','dir'])
. Powershell admite una gran parte de los comandos POSIXfuente
Después de mucho rascarme la cabeza, descubrí que ejecutar un archivo que se encuentra en C: \ Windows \ System32 \ mientras se ejecuta una versión de Python de 32 bits en una máquina de 64 bits es un problema potencial, debido a que Windows intenta superar en inteligencia al proceso, y redirigir las llamadas a C: \ Windows \ System32 a C: \ Windows \ SysWOW64.
Encontré un ejemplo de cómo solucionar esto aquí: http://code.activestate.com/recipes/578035-disable-file-system-redirector/
fuente
Para citar de la documentación:
"Antes de Python 3.5, estas tres funciones comprendían la API de alto nivel para subprocesar. Ahora puede usar run () en muchos casos, pero muchos de los códigos existentes llaman a estas funciones".
SO: en lugar de subprocess.call use subprocess.run para Python 3.5 y superior
fuente
Encontré el mismo problema mientras llamaba a PHP. La razón es que PHP no está en PATH, por lo que no se encontró el comando PHP. Pero PowerShell descubrió que existe en la ubicación actual y sugiere reemplazar el 'PHP' por el '. \ PHP' si confío en este comando. Entonces funciona bien.
fuente