Estoy esbozando la arquitectura para un conjunto de programas que comparten varios objetos interrelacionados almacenados en una base de datos. Quiero que uno de los programas actúe como un servicio que proporciona una interfaz de nivel superior para las operaciones en estos objetos, y que los otros programas accedan a los objetos a través de ese servicio.
Actualmente estoy apuntando a Python y al framework Django como las tecnologías para implementar ese servicio. Estoy bastante seguro de que imagino cómo demonizar el programa Python en Linux. Sin embargo, es un elemento de especificación opcional que el sistema debería admitir Windows. Tengo poca experiencia con la programación de Windows y ninguna experiencia con los servicios de Windows.
¿Es posible ejecutar un programa Python como un servicio de Windows (es decir, ejecutarlo automáticamente sin inicio de sesión del usuario)? No necesariamente tendré que implementar esta parte, pero necesito una idea aproximada de cómo se haría para decidir si se diseña en esta línea.
Editar: Gracias por todas las respuestas hasta ahora, son bastante completas. Quisiera saber una cosa más: ¿cómo es Windows consciente de mi servicio? ¿Puedo administrarlo con las utilidades nativas de Windows? ¿Cuál es el equivalente de poner un script de inicio / detención en /etc/init.d?
fuente
Respuestas:
Sí tu puedes. Lo hago usando las bibliotecas de pythoncom que vienen incluidas con ActivePython o que se pueden instalar con pywin32 ( extensiones de Python para Windows).
Este es un esqueleto básico para un servicio simple:
Su código iría en el
main()
método, generalmente con algún tipo de bucle infinito que podría interrumpirse al marcar una bandera, que configuró en elSvcStop
métodofuente
socket.setdefaulttimeout(60)
es? ¿Es necesario para un servicio o simplemente se copió accidentalmente de algún servicio existente? :)Aunque voté por 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 la forma incorrecta. ¿Qué pasa con la portabilidad y tal?
Me topé con el maravilloso administrador de servicios sin succión , lo que hizo que fuera realmente simple y sensato tratar con los servicios de Windows. Pensé que, dado que podía pasar opciones a un servicio instalado, podrí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 y actualizaré esta publicación a lo largo del proceso. También estoy interesado en usar virtualenvs en Windows, por lo que podría idear un tutorial tarde o temprano y vincularlo aquí.
fuente
new-service
en PowerShell debería poder hacer esto, pero iniciar (y monitorear) un script como servicio evidentemente implica muchos más detalles, lo que nssm se ocupa muy bien.La forma más sencilla es utilizar: NSSM, el Administrador de servicios sin succión:
1 - realice la descarga en https://nssm.cc/download
2 - instala el programa python como un servicio: Win prompt como administrador
c:> nssm.exe instalar WinService
3 - En la consola de NSSM:
ruta: C: \ Python27 \ Python27.exe
Directorio de inicio: C: \ Python27
Argumentos: c: \ WinService.py
4 - verifique los servicios creados en services.msc
fuente
La forma más sencilla de lograr esto es usar el comando nativo sc.exe:
Referencias
fuente
Hay un par de alternativas para instalar como servicio prácticamente cualquier ejecutable de Windows.
Método 1: Use instsrv y srvany de rktools.exe
Para Windows Home Server o Windows Server 2003 (también funciona con WinXP), las herramientas del Kit de recursos de Windows Server 2003 vienen con utilidades que se pueden usar en conjunto para esto, llamadas instsrv.exe y srvany.exe . Consulte este artículo KB137890 de Microsoft KB para obtener detalles sobre cómo usar estas utilidades.
Para Windows Home Server, hay un excelente contenedor fácil de usar para estas utilidades llamado acertadamente " Any Service Installer ".
Método 2: utilizar ServiceInstaller para Windows NT
Hay otra alternativa que utiliza ServiceInstaller para Windows NT (se puede descargar aquí ) con las instrucciones de Python disponibles . Contrariamente al nombre, también funciona con Windows 2000 y Windows XP. Aquí hay algunas instrucciones sobre cómo instalar un script de Python como servicio.
Después de mi respuesta inicial, noté que ya había preguntas y respuestas estrechamente relacionadas en SO. Ver también:
¿Puedo ejecutar un script Python como servicio (en Windows)? ¿Cómo?
¿Cómo hago para que Windows conozca un servicio que he escrito en Python?
fuente
NT
que sea necesariamente "contrario" al nombre, al menos no en el discurso popular del programador. Simplemente se refiere a la " arquitectura NT ", en oposición a la " marca NT ". Dicho esto, de acuerdo con la charla en Wikipedia, esto está a debate, ya que "no es un término oficial de Microsoft", pero sin embargo, existe una tradición con esta línea de pensamiento.Explicación paso a paso cómo hacerlo funcionar:
1- Primero crea un archivo python de acuerdo con el esqueleto básico mencionado anteriormente. Y guárdelo en una ruta, por ejemplo: "c: \ PythonFiles \ AppServerSvc.py"
2 - En este paso debemos registrar nuestro servicio.
Ejecute el símbolo del sistema como administrador y escriba como:
El primer argumento de binpath es la ruta de python.exe
El segundo argumento de binpath es la ruta de su archivo Python que ya creamos
No se pierda que debe poner un espacio después de cada signo " = ".
Entonces, si todo está bien, deberías ver
Ahora su servicio de Python está instalado como servicio de Windows ahora. Puede verlo en Service Manager y registro en:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ TestService
3- Ok ahora. Puede iniciar su servicio en el administrador de servicios.
Puede ejecutar cada archivo de Python que proporciona este esqueleto de servicio.
fuente
SetEvent(self.hWaitStop)
yWaitForSingleObject
. Basado en una copia irreflexiva de la respuesta seleccionada aquí probablemente. Esta es una buena manera de hacerlo que funciona de manera limpia tanto para la "depuración" como para los argumentos de "detención". (La parte sobre el uso de SC parece redundante cuandoHandleCommandLine
hace el trabajo, y puede ejecutar la depuración.)pysc: Administrador de control de servicios en Python
Script de ejemplo para ejecutar como un servicio tomado de pythonhosted.org :
fuente
Comencé a alojar como servicio con pywin32 .
Todo estaba bien, pero encontré el problema de que el servicio no pudo iniciarse en 30 segundos (tiempo de espera predeterminado para Windows) al iniciar el sistema. Fue crítico para mí porque el inicio de Windows se realizó simultáneamente en varias máquinas virtuales alojadas en una máquina física, y la carga de E / S fue enorme. Los mensajes de error fueron:
Error 1053: The service did not respond to the start or control request in a timely fashion.
Error 7009: Timeout (30000 milliseconds) waiting for the <ServiceName> service to connect.
Luché mucho con pywin, pero terminé usando NSSM como se propuso en esta respuesta . Fue muy fácil migrar a él.
fuente
nssm en python 3+
( Convertí mi archivo .py a .exe con pyinstaller )
nssm: como se dijo antes
En la consola de NSSM:
ruta: ruta \ a \ su \ program.exe
Directorio de inicio: ruta \ a \ su \ #sama como la ruta pero sin su program.exe
Argumentos: vacío
Si no desea convertir su proyecto a .exe
python {{your python.py file name}}
fuente
Un ejemplo completo de pywin32 usando bucle o subproceso
Después de trabajar en esto por unos días, aquí está la respuesta que hubiera deseado encontrar, usando pywin32 para mantenerlo agradable y autónomo.
Este es un código de trabajo completo para una solución basada en bucles y una basada en subprocesos. Puede funcionar tanto en python 2 como en 3, aunque solo he probado la última versión en 2.7 y Win7. El bucle debería ser bueno para el código de sondeo, y la banda de rodadura debería funcionar con más código similar al servidor. Parece funcionar bien con el servidor de camarera wsgi que no tiene una forma estándar de cerrar con gracia.
También me gustaría señalar que parece haber muchos ejemplos, como este, que son casi útiles, pero en realidad engañosos, porque han cortado y pegado otros ejemplos a ciegas. Podría estar equivocado. pero ¿por qué crear un evento si nunca lo esperas?
Dicho esto, todavía siento que estoy en un terreno algo inestable aquí, especialmente con respecto a cuán limpia es la salida de la versión de hilo, pero al menos creo que no hay nada engañoso aquí.
Para ejecutar, simplemente copie el código a un archivo y siga las instrucciones.
actualizar:
Use una bandera simple para terminar el hilo. Lo importante es que se imprime "hilo hecho".
Para un ejemplo más elaborado que sale de un hilo de servidor no cooperativo, vea mi publicación sobre el servidor de camarera wsgi .
fuente
La respuesta aceptada usando
win32serviceutil
funciona pero es complicada y dificulta la depuración y los cambios. Es mucho más fácil usar NSSM ( el Administrador de servicios sin succión) . Usted escribe y depura cómodamente un programa Python normal y cuando finalmente funciona, usa NSSM para instalarlo como servicio en menos de un minuto:Desde un símbolo del sistema elevado (administrador), ejecuta
nssm.exe install NameOfYourService
y completa estas opciones:C:\Python27\Python.exe
)c:\path\to\program.py
)Por cierto, si su programa imprime mensajes útiles que desea mantener en un archivo de registro, NSSM también puede manejar esto y mucho más por usted.
fuente
Para cualquiera que quiera crear servicio en VENV o Pycharm !!!!!!!
Después de leer todas las respuestas y crear algunos scripts, si puede ejecutar
python service.py install
ypython service.py debug
, peropython service.py start
no tiene respuesta.Tal vez sea causado por un problema venv, porque el servicio de Windows inicia su servicio por exec
PROJECT\venv\Lib\site-packages\win32\pythonservice.exe
.Puede usar
powershell
ocmd
probar su servicio para encontrar más detalles del error.Si recibe algún error como yo, puede verificar mi respuesta en otra pregunta, lo arreglé y publiqué mi código aquí .
fuente
https://www.chrisumbel.com/article/windows_services_in_python
Siga el PySvc.py
cambiando la carpeta dll
Sé que esto es viejo pero estaba atrapado en esto para siempre. Para mí, este problema específico se resolvió copiando este archivo - pywintypes36.dll
Desde -> Python36 \ Lib \ site-packages \ pywin32_system32
Para -> Python36 \ Lib \ site-packages \ win32
cd C:\Users\user\AppData\Local\Programs\Python\Python38-32
NET START PySvc
NET STOP PySvc
fuente