Como você executar um script Python como um serviço no Windows?

votos
211

Estou desenhando a arquitetura para um conjunto de programas que compartilham vários objetos inter-relacionados armazenados em um banco de dados. Eu quero um dos programas para atuar como um serviço que fornece uma interface de nível superior para as operações sobre esses objetos, e os outros programas para acessar os objetos por meio desse serviço.

Atualmente, estou apontando para Python eo framework Django como as tecnologias para implementar esse serviço com. Eu tenho certeza que eu descobrir como daemonize o programa Python no Linux. No entanto, é um item de especificação opcional que o sistema deve suportar o Windows. Eu tenho pouca experiência com programação do Windows e nenhuma experiência em tudo com os serviços do Windows.

É possível executar um programas Python como um serviço do Windows (ou seja, executá-lo automaticamente sem login do usuário)? Eu não terão necessariamente de implementar esta parte, mas eu preciso de uma idéia aproximada de como seria feito, a fim de decidir se projetar ao longo destas linhas.

Edit: Obrigado por todas as respostas até agora, eles são bastante abrangente. Eu gostaria de saber mais uma coisa: Como é o Windows ciente do meu serviço? Posso controlá-lo com os utilitários nativos do Windows? Qual é o equivalente de colocar um script start / stop em /etc/init.d?

Publicado 28/08/2008 em 15:28
fonte usuário
Em outras línguas...                            


11 respostas

votos
220

Sim você pode. Eu faço isso usando as bibliotecas pythoncom que vêm incluídos com ActivePython ou podem ser instalados com pywin32 (Python para extensões do Windows).

Este é um esqueleto básico para um serviço simples:

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)

Seu código iria na main()método geralmente com algum tipo de loop infinito que pode ser interrompida por verificar uma bandeira, que você definiu no SvcStopmétodo

Respondeu 28/08/2008 em 15:39
fonte usuário

votos
28

Embora eu upvoted a resposta escolhido um par de semanas atrás, entretanto Lutei muito mais com este tema. Ela se sente como ter uma instalação especial Python e usando módulos especiais para executar um script como um serviço é simplesmente o caminho errado. E sobre portabilidade e tal?

Me deparei com a maravilhosa Service Manager não-sucção , o que tornou muito simples e sensata de lidar com o Windows Services. Achei uma vez que eu poderia passar as opções para um serviço instalado, eu poderia muito bem escolher o meu Python executável e passar meu script como uma opção.

Eu ainda não tentei esta solução, mas vou fazê-lo agora e atualizar este post ao longo do processo. Também estou interessado em usar virtualenvs no Windows, para que eu possa chegar a um tutorial mais cedo ou mais tarde e link para ele aqui.

Respondeu 28/07/2014 em 14:41
fonte usuário

votos
23

Existem algumas alternativas para a instalação como um serviço praticamente qualquer executável do Windows.

Método 1: Use instsrv e srvany de rktools.exe

Para o Windows Home Server ou Windows Server 2003 (funciona com WinXP também), os Resource Kit Tools Windows Server 2003 vem com utilitários que podem ser usados em conjunto para este, chamado instsrv.exe e srvany.exe . Veja este artigo Microsoft KB KB137890 para obter detalhes sobre como usar esses utils.

Para o Windows Home Server, há uma grande invólucro amigável para esses utilitários nomeado apropriadamente " qualquer serviço Installer ".

Método 2: Usar ServiceInstaller para Windows NT

Há uma outra alternativa usando ServiceInstaller para Windows NT ( download-poder aqui ) com instruções python disponíveis . Ao contrário do que o nome, ele funciona tanto com Windows 2000 e Windows XP também. Aqui estão algumas instruções sobre como instalar um script Python como um serviço.

A instalação de um script Python

Execute ServiceInstaller para criar um novo serviço. (Neste exemplo, assume-se que pitão está instalado em c: \ python25)

Service Name  : PythonTest
Display Name : PythonTest 
Startup : Manual (or whatever you like)
Dependencies : (Leave blank or fill to fit your needs)
Executable : c:\python25\python.exe
Arguments : c:\path_to_your_python_script\test.py
Working Directory : c:\path_to_your_python_script

Após a instalação, abra aplicação dos serviços do Painel de Controle, selecione e iniciar o serviço PythonTest.

Depois da minha resposta inicial, notei que havia intimamente relacionados Q & A já postou no SO. Veja também:

Posso executar um script Python como um serviço (no Windows)? Como?

Como faço para tornar o Windows ciente de um serviço de eu ter escrito em Python?

Respondeu 28/02/2009 em 09:30
fonte usuário

votos
11

A maneira mais simples para obter este é usar sc.exe comando nativa:

sc create PythonApp binPath= "C:\Python34\Python.exe --C:\tmp\pythonscript.py"
  1. https://technet.microsoft.com/en-us/library/cc990289(v=ws.11).aspx
  2. a criação de um serviço com sc.exe; como passar em parâmetros de contexto
Respondeu 07/12/2016 em 12:23
fonte usuário

votos
7

Explicação passo a passo como fazer o trabalho:

1- Primeiro criar um ficheiro de pitão de acordo com o esqueleto básico acima mencionado. E guardá-lo para um caminho, por exemplo: "c: \ PythonFiles \ AppServerSvc.py"

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):
        # Your business logic or call to any class should be here
        # this time it creates a text.txt and writes Test Service in a daily manner 
        f = open('C:\\test.txt', 'a')
        rc = None
        while rc != win32event.WAIT_OBJECT_0:
            f.write('Test Service  \n')
            f.flush()
            # block for 24*60*60 seconds and wait for a stop event
            # it is used for a one-day loop
            rc = win32event.WaitForSingleObject(self.hWaitStop, 24 * 60 * 60 * 1000)
        f.write('shut down \n')
        f.close()

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

2 - Nesta etapa, deve registrar o nosso serviço.

Executar o prompt de comando como administrador e digite como:

sc criar TestService binpath = "C: \ Python36 \ python.exe c: \ PythonFiles \ AppServerSvc.py" DisplayName = "TestService" start = auto

o primeiro argumento de binpath é o caminho da python.exe

O segundo argumento de binpath é o caminho do seu arquivo de python que já criado

Não perca que você deve colocar um espaço após cada " = " sinal.

Então, se tudo estiver ok, você deve ver

[SC] CreateService SUCESSO

Agora, o seu serviço de python é instalado como serviço de janelas agora. Você pode vê-lo no Gerenciador de serviços e registro em:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ TestService

3- Ok agora. Você pode começar seu serviço no Service Manager.

Você pode executar todos os arquivos python que fornece este esqueleto serviço.

Respondeu 29/06/2017 em 08:37
fonte usuário

votos
3

A maneira mais simples é usar o: NSSM - o não-Sucking Service Manager:

1 - fazer download no https://nssm.cc/download

2 - instalar o programa python como um serviço: Win solicitará como admin

c:> nssm.exe instalar WinService

3 - Na consola NSSM's:

caminho: C: \ python27 \ Python27.exe

diretório de inicialização: C: \ python27

Argumentos: c: \ WinService.py

4 - verificar os serviços criados em services.msc

Respondeu 27/09/2017 em 14:05
fonte usuário

votos
2

Comecei a hospedagem como um serviço com pywin32 .

Tudo estava bem, mas eu encontrei o problema que o serviço não foi capaz de começar dentro de 30 segundos (tempo limite padrão para Windows) na inicialização do sistema. Ele foi fundamental para mim, porque a inicialização do Windows ocorreu simultaneamente em várias máquinas virtuais hospedadas em uma máquina física e carga IO era enorme. mensagens de erro foram:

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.

Eu lutei muito com pywin, mas acabou com o uso NSSM como foi proposto nesta resposta . Foi muito fácil de migrar para ele.

Respondeu 12/10/2018 em 13:07
fonte usuário

votos
0

NSSM em em python 3+

(I convertido meu arquivo .py para .exe com pyinstaller)

NSSM: como disse antes

  • executar NSSM instalar {ServiceName}
  • Na consola NSSM's:

    path: caminho \ para \ o \ program.exe

    Diretório de inicialização: caminho \ para \ o \ #same como o caminho, mas sem o seu program.exe

    Argumentos: vazias

Respondeu 05/06/2019 em 00:42
fonte usuário

votos
0

Para quem deseja criar serviço em VENV ou PyCharm !!!!!!!

Após ler todos os anwsers e criar alguns scripts, se você pode executar python service.py installe python service.py debug, mas python service.py startnão tem resposta.

Talvez seja causada por venv problema, porque o serviço Windows iniciar o seu serviço por exec PROJECT\venv\Lib\site-packages\win32\pythonservice.exe.

Você pode usar powershellou cmdtestar o seu serviço para encontrar mais detalhes do erro.

PS C:\Users\oraant> E:

PS E:\> cd \Software\PythonService\venv\Lib\site-packages\win32

PS E:\Software\PythonService\venv\Lib\site-packages\win32> .\pythonservice.exe -debug ttttt
Debugging service ttttt - press Ctrl+C to stop.
Error 0xC0000004 - Python could not import the service's module

Traceback (most recent call last):
  File "E:\Software\PythonService\my_service.py", line 2, in <module>
    import win32serviceutil
ModuleNotFoundError: No module named 'win32serviceutil'

(null): (null)

Se você receber algum erro como eu, então você pode verificar a minha resposta em outra pergunta, eu fixa-lo e postar meu código aqui .

Respondeu 29/05/2019 em 08:57
fonte usuário

votos
0

A resposta aceita usando win32serviceutilobras, mas é complicado e torna a depuração e muda mais difícil. É muito mais fácil de usar NSSM ( o gerente não-Sucking Service) . Você escreve e confortavelmente depurar um programa python normal e quando ele finalmente funciona você usa NSSM para instalá-lo como um serviço em menos de um minuto:

De um prompt de comando elevado (admin) é executado nssm.exe install NameOfYourServicee você preencher estas opções:

  • caminho : (o caminho para python.exe por exemplo C:\Python27\Python.exe)
  • Argumentos : (o caminho para o script python, por exemplo c:\path\to\program.py)

By the way, se o seu programa imprime úteis mensagens que você deseja manter em um arquivo de log NSSM pode também lidar com isso e muito mais para você.

Respondeu 10/11/2018 em 15:52
fonte usuário

votos
-2

pysc: Service Manager Controle em Python

Script de exemplo para ser executado como um serviço retirado pythonhosted.org :

from xmlrpc.server import SimpleXMLRPCServer

from pysc import event_stop


class TestServer:

    def echo(self, msg):
        return msg


if __name__ == '__main__':
    server = SimpleXMLRPCServer(('127.0.0.1', 9001))

    @event_stop
    def stop():
        server.server_close()

    server.register_instance(TestServer())
    server.serve_forever()

Criar e iniciar o serviço

import os
import sys
from xmlrpc.client import ServerProxy

import pysc


if __name__ == '__main__':
    service_name = 'test_xmlrpc_server'
    script_path = os.path.join(
        os.path.dirname(__file__), 'xmlrpc_server.py'
    )
    pysc.create(
        service_name=service_name,
        cmd=[sys.executable, script_path]
    )
    pysc.start(service_name)

    client = ServerProxy('http://127.0.0.1:9001')
    print(client.echo('test scm'))

Pare e eliminar serviço

import pysc

service_name = 'test_xmlrpc_server'

pysc.stop(service_name)
pysc.delete(service_name)
pip install pysc
Respondeu 03/03/2017 em 20:29
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more