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.