2009-05-23 11 views
34

tengo el siguiente código que está intentando iniciar cada uno de los "comandos" más adelante en Linux. El módulo intenta mantener cada uno de los 2 comandos en ejecución si cualquiera de ellos se cuelga por alguna razón.Python OSError: [Errno 2]

#!/usr/bin/env python 
import subprocess 

commands = [ ["screen -dmS RealmD top"], ["screen -DmS RealmD top -d 5"] ] 
programs = [ subprocess.Popen(c) for c in commands ] 
while True: 
    for i in range(len(programs)): 
     if programs[i].returncode is None: 
      continue # still running 
     else: 
      # restart this one 
      programs[i]= subprocess.Popen(commands[i]) 
     time.sleep(1.0) 

Al ejecutar el código se lanza la siguiente excepción:

Traceback (most recent call last): 
    File "./marp.py", line 82, in <module> 
    programs = [ subprocess.Popen(c) for c in commands ] 
    File "/usr/lib/python2.6/subprocess.py", line 595, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.6/subprocess.py", line 1092, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

Creo que me estoy perdiendo algo obvio, nadie puede ver lo que está mal con el código anterior?

+2

puede usar 'programas [i] .poll()' 'en lugar de programas [i]. returncode'. – jfs

+0

relacionados: [subprocess.call usando cuerdas vs utilizando la lista] (http://stackoverflow.com/q/15109665/4279) – jfs

Respuesta

63

Uso ["screen", "-dmS", "RealmD", "top"] en lugar de ["screen -dmS RealmD top"].

Tal vez también utilizar la ruta completa a screen.

Si aún no se puede encontrar el programa, también puede ir a través de su caparazón con shell=True, pero luego debe citar y escapar de sus parámetros, etc. Asegúrese de leer el information in the docs si planea hacerlo.

+1

Docs dicen una cadena o una secuencia se pueden utilizar. –

+0

comandos = [["pantalla", "-dmS", "RealmD", "top"], ["pantalla", "-DmS", "RealmD", "top", "-d", "5"] ] ¡Funcionó a la perfección! – Caedis

+0

@colin: en este caso, se utilizó una secuencia y debe contener los parámetros por separado. Probablemente una cadena simple (sin el []) también funcionaría. – sth

7

Sólo conjetura es que no puede encontrar screen. Pruebe /usr/bin/screen o lo que which screen le proporcione.

7

El problema es que su comando debe dividirse. los subprocesos requieren que el cmd sea una lista, no una cadena. No debería ser:

subprocess.call('''awk 'BEGIN {FS="\t";OFS="\n"} {a[$1]=a [$1] OFS $2 FS $3 FS $4} END 
{for (i in a) {print i a[i]}}' 2_lcsorted.txt > 2_locus_2.txt''') 

que no funciona. Si alimenta un subproceso de una cadena, asume que esa es la ruta al comando que desea ejecutar. El comando necesita ser una lista. Consulte http://www.gossamer-threads.com/lists/python/python/724330. Además, como está utilizando la redirección de archivos, debe usar subprocess.call(cmd, shell=True). También puede usar shlex.

+0

'subprocess.call (" ejecutable -parameter 1 -hello " , shell = True) 'funciona (suponiendo que esté en la RUTA del shell) – WoJ

+0

@WoJ: Prefiero no correr ese riesgo ... – refi64

+0

Depende de la llamada. Si no analiza la entrada, entonces es tan seguro como un comando de shell. – WoJ

2
commands = [ "screen -dmS RealmD top", "screen -DmS RealmD top -d 5" ] 
programs = [ subprocess.Popen(c.split()) for c in commands ] 
+6

Utilice 'shlex.split()' en lugar de 'string.split()' –

0

Por si acaso .. También quedó atascado con este error y el problema era que mis archivos estaban en DOS en lugar de UNIX a modo:

return subprocess.call(lst_exp) 

donde lst_exp es una lista de argumentos, uno de ellos fue "no encontrado" porque estaba en DOS en lugar de UNIX pero el error lanzado fue el mismo:

File "/var/www/run_verifier.py", line 59, in main 
return subprocess.call(lst_exp) 
File "/usr/lib/python2.7/subprocess.py", line 522, in call 
return Popen(*popenargs, **kwargs).wait() 
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ 
errread, errwrite) 
File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child 
raise child_exception 
OSError: [Errno 2] No such file or directory 
1

llegué mismo error cuando escribí la siguiente manera: -

subprocess.Popen("ls" ,shell = False , stdout = subprocess.PIPE ,stderr = subprocess.PIPE) 

Y problema se resuelve cuando hice shell = True .Es trabajará

subprocess.Popen("ls" ,shell = False , stdout = subprocess.PIPE ,stderr = subprocess.PIPE, shell=True)

Cuestiones relacionadas