[Python-es] Lanzar aplicación como demonio

marco python en diezplus.com
Mie Mar 2 18:04:46 CET 2011


El 02/03/2011 16:42, Oswaldo Hernández escribió:
> El 01/03/2011 20:15, Sergio Fernández escribió:
>> ¿por qué no le echas un vistazo al módulo daemon...?
>> http://pypi.python.org/pypi/python-daemon/
Ya le he echado un vistazo a ese módulo, pero sólamente funciona bajo 
Unix. Gracias.
>>
>> 2011/3/1 marco<python en diezplus.com>:
>>> Hola a todos!!
>>>
>>> Tengo la siguiente duda.
>>>
>>> Necesito lanzar un proceso que quede residente en memoria y que cada 
>>> cierto
>>> tiempo ejecute algo,
>>> debería quedar tipo demonio de linux o tipo TSR (Terminate and Stay
>>> Resident).
>
> Terminate and Stay Resident ... Ufff hace mas de 10 años que no veia 
> eso ;)
>
>>> Utilizo python 2.6 sobre Windows 7.
>>> Mirad el siguiente ejemplo,
>>>
>>> #leer_com.py###########################
>>> import threading, time
>>> def espera():
>>>     while True:
>>>         time.sleep(15)
>>>         # comprobaciones varias
>>>         # etc
>>>         print "comprobando..."
>>> p = threading.Thread(target = espera,)
>>> p.setDaemon(True)
>>> p.start()
>>> ######################################
>>>
>>> Si lo ejecuto en una shell de python, sin problema, cada 15 segundos me
>>> ejecuta la función espera,
>>> mientras tanto yo puedo seguir trabajando con cualquier cosa desde 
>>> esa misma
>>> shell.
>>> Ahora bien, si lo ejecuto desde una línea de comandos del sistema, ej.:
>>>   c:\>python leer_com.py
>>> acaba el programa y no hace nada de nada. Lo he convertido a 
>>> ejecutable con
>>> py2exe y más de
>>> lo mismo, no funciona. Si hago  p.join()  en el script queda en 
>>> espera pero
>>> no vuelve al interprete de comandos
>>> que lo que yo necesito. Necesito lanzarlo y a ejecutar otra cosa.
>
> El programa termina porque se alcanza el final y ya no tiene nada que 
> hacer. Aunque hayas lanzado el tread debes mantenerlo vivo, un simple 
> 'while True: pass' al final hara lo que necesitas.
>
> Para simular un daemon en windows puedes crear un servicio con py2exe 
> o simplemente hacer que se cargue al arrancar el equipo.
>
> Saludos,
Ya se que ha de mantenerse vivo el thread, si hago p.join() o while True 
como me aconsejas hace que se mantenga, pero el programa no finaliza. Lo 
que yo necesito es lanzarlo desde una shell y que quede residente aunque 
yo cierre la shell y que funcione bajo Windows 7. No quiero que sea un 
servicio de windows, necesito que sea simple python sin acceso a API de 
windows, lo que no se si esto será posible...

Gracias.




Más información sobre la lista de distribución Python-es