Nuestros desarrolladores estrellas han agotado sus depósitos de café, investigando diariamente por la respuesta, hasta que Daniela halló la solución en Bitbucket y ahora la comparte contigo.
Solución:
Sí tu puedes. Lo hago usando las bibliotecas de pythoncom que vienen incluidas con ActivePython o se pueden instalar con pywin32 (Python para extensiones de Windows).
Este es un esqueleto básico para un servicio simple:
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
class AppServerSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "Test Service"
def __init__(self,args):
win32serviceutil.ServiceFramework.__init__(self,args)
self.hWaitStop = win32event.CreateEvent(None,0,0,None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,''))
self.main()
def main(self):
pass
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)
Su código iría en el main()
método, generalmente con algún tipo de ciclo infinito que podría interrumpirse al marcar una bandera, que configuraste en el SvcStop
método
Aunque voté a favor de la respuesta elegida hace un par de semanas, mientras tanto luché mucho más con este tema. Parece que tener una instalación especial de Python y usar módulos especiales para ejecutar un script como servicio es simplemente el camino equivocado. ¿Qué pasa con la portabilidad y tal?
Me topé con el maravilloso Administrador de servicios sin succión, que hizo que fuera realmente simple y sensato manejar los Servicios de Windows. Pensé que, dado que podía pasar opciones a un servicio instalado, también podía seleccionar mi ejecutable de Python y pasar mi script como una opción.
Todavía no he probado esta solución, pero lo haré ahora mismo y actualizaré esta publicación a lo largo del proceso. También estoy interesado en usar virtualenvs en Windows, por lo que podría crear un tutorial tarde o temprano y vincularlo aquí.
La forma más sencilla es utilizar: NSSM: el administrador de servicios que no succiona. Simplemente descargue y descomprima en la ubicación que elija. Es una utilidad autónoma, alrededor de 300 KB (mucho menos que instalar todo el paquete pywin32 solo para este propósito) y no se necesita “instalación”. El zip contiene una versión de 64 y 32 bits de la utilidad. Cualquiera de los dos debería funcionar bien en los sistemas actuales (puede usar la versión de 32 bits para administrar servicios en sistemas de 64 bits).
enfoque de interfaz gráfica de usuario
1 – instalar el programa python como servicio. Abra un aviso de Win como administrador
c:>nssm.exe install WinService
2 – En la consola GUI de NSSM:
ruta: C:Python27Python27.exe
Directorio de inicio: C:Python27
Argumentos: c:WinService.py
3 – verifique los servicios creados en services.msc
Enfoque de secuencias de comandos (sin GUI)
Esto es útil si su servicio debe ser parte de un procedimiento automatizado, no interactivo, que puede estar fuera de su control, como un lote o un script de instalación. Se supone que los comandos se ejecutan con privilegios administrativos.
Para mayor comodidad, los comandos se describen aquí simplemente haciendo referencia a la utilidad como nssm.exe
. Sin embargo, es aconsejable referirse a él de forma más explícita en el scripting con su ruta completa c:pathtonssm.exe
ya que es un ejecutable autónomo que puede estar ubicado en una ruta privada que el sistema no conoce.
1. Instalar el servicio
Debe especificar un nombre para el servicio, la ruta al ejecutable de Python adecuado y la ruta al script:
nssm.exe install ProjectService "c:pathtopython.exe" "c:pathtoprojectappmain.py"
Más explícitamente:
nssm.exe install ProjectService
nssm.exe set ProjectService Application "c:pathtopython.exe"
nssm.exe set ProjectService AppParameters "c:pathtoprojectappmain.py"
Alternativamente, es posible que desee que su aplicación de Python se inicie como un módulo de Python. Un enfoque fácil es decirle a nssm que debe cambiar al directorio de inicio adecuado, como lo haría usted mismo al iniciar desde un shell de comandos:
nssm.exe install ProjectService "c:pathtopython.exe" "-m app.main"
nssm.exe set ProjectService AppDirectory "c:pathtoproject"
Este enfoque funciona bien con entornos virtuales e instalaciones de Python independientes (integradas). Solo asegúrese de haber resuelto correctamente cualquier problema de ruta en esos entornos con los métodos habituales. nssm tiene una forma de establecer variables de entorno (por ejemplo, PYTHONPATH) si es necesario, y también puede iniciar scripts por lotes.
2. Para iniciar el servicio
nssm.exe start ProjectService
3. Para detener el servicio
nssm.exe stop ProjectService
4. Para quitar el servicioespecifica el confirm
parámetro para omitir la confirmación interactiva.
nssm.exe remove ProjectService confirm