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?
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