2010-06-11 14 views
66

estoy consiguiendo el error siguiente:Windows no puede encontrar el archivo en subprocess.call()

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

Mi código es:

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

Windows 7, 64 bits. Python 3.x más reciente, estable.

¿Alguna idea?

Gracias,

+0

y ¿qué es este archivo ejecutable? – SilentGhost

+0

La parte ejecutable "android" de Android SDK – Sri

+1

Y está * está * disponible en PATH – Sri

Respuesta

120

No estoy seguro de por qué, pero en mi máquina de Windows tuve que agregar un 'shell = True' a la llamada.

E.g. para dir debería escribir:

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

Espero que esto ayude,

Douglas

citar de la documentación: La única vez que es necesario especificar shell = true en Windows es cuando el comando que deseo de ejecutar está integrado en el shell (por ejemplo, dir o copiar). No necesita shell = True para ejecutar un archivo por lotes o un ejecutable basado en consola.

+13

Eso es porque no hay ningún ejecutable llamado 'dir.exe' mientras hay un'/bin/ls' en * nix. 'dir' es implementado por _CMD.EXE_ al igual que' cd' es implementado por _bash_. – Apalala

+0

Esto se desaconseja enérgicamente. https://docs.python.org/2/library/subprocess.html#frequently-used-arguments –

+5

@nueverest Solo cuando la cadena _del comando se construye desde la entrada externa_ – Jirka

3

Si la ruta tiene espacios, es que citan?

Y, por supuesto, se escapó correctamente de las barras diagonales inversas, o se usaron barras oblicuas, ¿no?

+0

Sí, se cita correctamente. El mismo comando funciona cuando se llama a través del método os.system(). – Sri

9

En Windows, creo que el módulo subprocess no se ve en el PATH a menos que pase shell=True. Sin embargo, shell=True puede suponer un riesgo para la seguridad si pasa argumentos que pueden provenir de fuera de su programa. Para hacer que subprocess no obstante pueda encontrar el ejecutable correcto, puede usar shutil.which. Supongamos que el archivo ejecutable en su PATH se llama frob:

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

(. Esto funciona en Python 3.3 y superior)

6

En Windows usted tiene que 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.

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

/c le dice cmd para ejecutar el comando seguimiento

Esto es más seguro que usar shell = True, que permite que las inyecciones de concha.

+0

Muy útil. Gracias. – Moondra

+0

¿Cómo mantendría la pantalla abierta? – Moondra

0

Si está utilizando powershell, entonces será subprocess.call(['powershell','-command','dir']). Powershell admite una gran parte de los comandos POSIX

Cuestiones relacionadas