Pregunta

Tengo el siguiente código que está intentando iniciar cada uno de los "comandos" más adelante en Linux. El módulo intenta mantener a cada uno de los 2 comandos que se ejecutan si bien debe dormir por la razón que sea.

#!/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?

¿Fue útil?

Solución

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

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

Otros consejos

Sólo adivinar es que no se puede encontrar screen. Trate /usr/bin/screen o lo que le da which screen.

El problema es que el comando debe ser dividida. subprocces requiere que el cmd es una lista, no es 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''') 

Eso no funcionará. Si usted alimenta subproceso una cadena, se supone que ese es el camino para el comando que desea ejecutar. El comando tiene que ser una lista. Echa un vistazo a http://www.gossamer-threads.com/lists/python/ Python / 724.330 . Además, debido a que está utilizando redirección de archivos, debe utilizar subprocess.call(cmd, shell=True). También puede utilizar shlex.

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

Tengo 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 .it trabajar

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

Por si acaso .. También me quedé con este error y el problema era que mis archivos estaban en DOS en lugar de UNIX así en:

 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top