2012-03-29 26 views
27

Tengo algunos comandos personalizados.Error de Popen: [Errno 2] No existe ningún archivo o directorio

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

Pero si tengo mis propios comandos al sistema como deactivate, me sale 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 

no hablar de que necesito para ejecutar este bajo mi virtualenv caja de arena.

+2

Quizás 'python' no esté en la variable de entorno' PATH' cuando se ejecute el script. Intente establecer la ruta completa a python, es decir, '/ usr/bin/python'. –

+1

¿Puedes explicar lo que estás tratando de lograr? Sospecho que el shell hijo que está iniciando con 'subprocess' no ha" originado "el script de activación virtualenv, y no se hereda del proceso principal de Python (suponiendo que es allí donde lo está ejecutando). –

Respuesta

82

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

+40

funcionó para mí, pero ¿por qué? – YMomb

+0

aún no funciona – Woeitg

+5

@YMomb: 'deactivate' es una función de shell. Para ejecutarlo, necesitas un caparazón. Aunque no tiene sentido intentar ejecutarlo en un nuevo shell (el nuevo shell probablemente no lo tendrá definido hasta que se llame a 'venv/bin/activate' y el niño normalmente no puede modificar su entorno primario de todos modos si OP espera desactiva el virtualenv actual establecido en el shell primario. Es la misma razón por la cual 'subprocess.call ('cd')' provoca "No tal archivo o directorio" y se puede arreglar usando 'shell = True' y sería igual inútil. Ver [¿Por qué cd no es un programa?] (http://unix.stackexchange.com/q/38808/1321) – jfs

3

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

subprocesos
0

estoy desove así:

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 usando subproceso desde Python 2.5 no lo soporta. 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.

17

Solo una nota. shell=True fue probablemente la solución correcta para el o.p., ya que no cometieron el siguiente error, pero también puede obtener el error "No existe ese archivo o directorio" si no divide el 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 para ser el primer elemento de argumentos, por lo que falla, no hay un "echo 1" ejecutable. 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 sobrecarga de lo que pueda necesitar. Ver Popen() documentation para los casos cuando shell=True es realmente útil.

+0

Esta versión del error puede ocurrir si olvida poner comas entre los literales de cadena, como Python los concatenará: 'sp.Popen (['echo' '1']) # FAILS' –

Cuestiones relacionadas