such error python subprocess popen

python - such - Error de Popen:[Errno 2] No existe tal archivo o directorio



no such file or directory python error (4)

Tengo algunos comandos personalizados.

# works subprocess.Popen([''python''], stdout=subprocess.PIPE)

Pero si tengo mis propios comandos de sistema como deactivate , obtengo ese error

Traceback (most recent call last): File "runner2.py", line 21, in <module> main() File "runner2.py", line 18, in main subprocess.Popen([''deactivate'',], stdout=subprocess.PIPE) File "/usr/lib/python2.6/subprocess.py", line 633, in __init__ errread, errwrite) File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory

Dejado solo necesito ejecutar esto bajo mi caja de arena virtualenv.


Debe deactivate la ruta completa de su programa y luego el módulo de subproceso debería poder encontrarlo.


Estoy generando subprocesos como ese:

SHUTDOWN_CMD = os.path.sep.join(["c:", "windows", "system32", "shutdown.exe"]) def abortShutdown(): os.spawnv(os.P_NOWAIT, SHUTDOWN_CMD, [SHUTDOWN_CMD, ''/A'']) time.sleep(3)

No estoy utilizando un subproceso porque Python 2.5 no lo admite. Tuve que usar el uso de la ruta COMPLETA para que funcione y supongo que también debe usar la ruta completa a sus comandos personalizados.


Intente agregar un parámetro adicional ''shell = True'' a la llamada de Popen .


Solo una nota. shell=True probablemente sea la solución correcta para la operación, ya que no cometieron el siguiente error, pero también puede obtener el error "No existe ese archivo o directorio" si no divide su ejecutable de sus argumentos.

import subprocess as sp, shlex sp.Popen([''echo 1'']) # FAILS with "No such file or directory" sp.Popen([''echo'', ''1'']) # SUCCEEDS sp.Popen([''echo 1''], shell=True) # SUCCEEDS, but extra overhead sp.Popen(shlex.split(''echo 1'')) # SUCCEEDS, equivalent to #2

Sin shell=True , Popen espera que el ejecutable sea el primer elemento de args, por lo que falla, no hay un ejecutable "echo 1". Agregar shell=True invoca el shell de su sistema y pasa el primer elemento de args al shell. es decir, para Linux, Popen([''echo 1''], shell=True) es equivalente a Popen(''/bin/sh'', ''-c'', ''echo 1'') que es más de lo que puede necesitar. Consulte la documentación de Popen () para los casos en que shell=True es realmente útil.