Executar script python como serviço do Windows

3,935 views
Skip to first unread message

Gustavo W

unread,
Jan 14, 2013, 7:16:40 PM1/14/13
to python...@googlegroups.com
Ola a todos,
Sou novo por aqui, estou programando a uns 4 meses com python, tanto para Windows, Linux e Android. Estou fascinado com a simplicidade e o poder dessa linguagem. 

Sempre consegui resolver minhas duvidas no python com uma boa pesquisada no Oraculo Google.
Mas agora esta difícil, preciso executar um script python como serviço no windows, mas ainda não entendi como fazer isso.

Pelo que vi o script tem que ser todo escrito para rodar como serviço. É isso mesmo? ou eu posso adaptar um ja existente para isso?

Um exemplo que achei foi este:

  1. import win32service  
  2. import win32serviceutil  
  3. import win32event  
  4.  
  5. class PySvc(win32serviceutil.ServiceFramework):  
  6.    # you can NET START/STOP the service by the following name  
  7.    _svc_name_ = "PySvc"  
  8.    # this text shows up as the service name in the Service  
  9.    # Control Manager (SCM)  
  10.    _svc_display_name_ = "Python Test Service"  
  11.    # this text shows up as the description in the SCM  
  12.    _svc_description_ = "This service writes stuff to a file"  
  13.      
  14.    def __init__(self, args):  
  15.        win32serviceutil.ServiceFramework.__init__(self,args)  
  16.        # create an event to listen for stop requests on  
  17.        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)  
  18.      
  19.    # core logic of the service    
  20.     def SvcDoRun(self):  
  21.        import servicemanager  
  22.          
  23.        f = open('test.dat', 'w+')  
  24.        rc = None  
  25.          
  26.        # if the stop event hasn't been fired keep looping  
  27.        while rc != win32event.WAIT_OBJECT_0:  
  28.            f.write('TEST DATA\n')  
  29.            f.flush()  
  30.            # block for 5 seconds and listen for a stop event  
  31.            rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)  
  32.              
  33.        f.write('SHUTTING DOWN\n')  
  34.        f.close()  
  35.      
  36.    # called when we're being shut down      
  37.    def SvcStop(self):  
  38.        # tell the SCM we're shutting down  
  39.        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)  
  40.        # fire the stop event  
  41.        win32event.SetEvent(self.hWaitStop)  
  42.          
  43. if __name__ == '__main__':  
  44.    win32serviceutil.HandleCommandLine(PySvc)  

Mas não entendi onde eu coloco meu código.

Em resumo, o meu programa fica esperando uma conexão por socket, e conforme a mensagem que recebe, executa uma determinada ação.

Alguém ja conseguiu executar um programa em python como serviço do windows? poderia me dizer como fez?

Obrigado desde ja.

Gustavo W

unread,
Jan 14, 2013, 7:18:49 PM1/14/13
to python...@googlegroups.com
Faltou o link de onde peguei esse codigo: 

Rodrigo Dias Arruda Senra

unread,
Jan 14, 2013, 7:31:01 PM1/14/13
to python...@googlegroups.com
[ Gustavo W ]:
---------------------
>Mas agora esta difícil, preciso executar um script python como serviço no
>windows, mas ainda não entendi como fazer isso.
>Pelo que vi o script tem que ser todo escrito para rodar como serviço. É
>isso mesmo?

Exato.

Note que pelas linhas abaixo o seu script já é capaz de tratar parâmetros da linha de comando.

>
> 43. if __name__ == '__main__':
> 44. win32serviceutil.HandleCommandLine(PySvc)
>
>
>Mas não entendi onde eu coloco meu código.

Não precisa colocar em um lugar especial. Mas precisa instalá-lo.

>Alguém ja conseguiu executar um programa em python como serviço do
>windows?

Sim. Mas já faz uma década (literalmente).

> poderia me dizer como fez?

Quem descreve isso bem é o livro " Python porgramming on Win32" de Hammond & Robinson.

Vc precisa instalar o serviço.
Rode o programa em uma caixa-dos com o parâmetro "install".

Vc pode iniciar ou parar o serviço com os parâmetro "start" e "stop" ou pela interface do Windows.

Abração
Senra

http://rodrigo.senra.nom.br

Rodrigo Dias Arruda Senra

unread,
Jan 14, 2013, 7:32:45 PM1/14/13
to python...@googlegroups.com
[ Gustavo W ]:
---------------------
>Faltou o link de onde peguei esse codigo:
>http://www.chrisumbel.com/article/windows_services_in_python
>

A explicação que eu lhe dei em resposta a seu email anterior
está documentada na página que vc mesmo passou, no trecho:

Service Installation

Now that the service itself is written we can install it as follows:

C:\Dev\Projects\PySvc> python.exe .\PySvc.py install

Abração
Senra

http://rodrigo.senra.nom.br

Gustavo W

unread,
Jan 15, 2013, 10:03:40 AM1/15/13
to python...@googlegroups.com
Obrigado pela resposta Rodrigo,
Na verdade esse script que postei é só o exemplo do site, mas não consegui entender direito. eu ja tinha instalado ele com o parametro install, mas o windows estava me dando um erro (não lembro qual). Mas eu testei agora de novo e funcionou (fiz alguma coisa errada da primeira vez).

O programa que estou escrevendo é parecido com esse:

import socket
import os

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #Criado socket do servidor
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("",1212))   #Fica escutando qualquer IP que fale na porta 1616
sock.listen(10)    #Escuta ate 10 conexoes simultaneas
while 1:
 print " "
 print "------------------"
 print "Esperando comando: "
 conn,addr= sock.accept()
 msg='1'
 while msg != "":
        msg = conn.recv(1024)   #Recebe uma mensagem pelo socket aberto, recebe ate 1024 bytes
        #print "Mensagem recebida -> %s" %(msg)
        if msg.find("CMD1")!=-1:
          print 'Comando 1'
          os.system('echo Comando 1 > c:\\teste.txt')
          break
        if msg.find("CMD2") != -1:
          print 'Comando 2'
          os.system('echo Comando 2 > c:\\teste.txt')
          break
        if msg.find("CMD3") != -1:
          print 'Comando 3'
          os.system('echo Comando 3 > c:\\teste.txt')
          break
        conn.close()
sock.close()



Minha duvida é: como transformar o código acima isso em um serviço do Windows? é só colocar ele na função "SvcDoRun()"? e na função "SvcStop()" colocar algo como "sock.close()" para encerrar o socket?

Outro coisa que não entendi foi a parte "# block for 5 seconds and listen for a stop event", o que ele faz ali? trava o programa por 5seg para ver se tem um sinal de parada? se for isso mesmo, iria me atrapalhar e muito, pois vai que alguem envie um comando para o meu programa nesses 5 seg, ai o programa não recebe e não executa o comando.

Poderia me explicar melhor?

Leonardo Santagada

unread,
Jan 15, 2013, 10:38:15 AM1/15/13
to python...@googlegroups.com

2013/1/15 Gustavo W <gust...@gmail.com>

Outro coisa que não entendi foi a parte "# block for 5 seconds and listen for a stop event", o que ele faz ali? trava o programa por 5seg para ver se tem um sinal de parada? se for isso mesmo, iria me atrapalhar e muito, pois vai que alguem envie um comando para o meu programa nesses 5 seg, ai o programa não recebe e não executa o comando.

Poderia me explicar melhor?

A parte de funcionamento de serviços do windows tu pode ler na MSDN, esse código python só te mostra como o encapsulamento da api do windows funciona.


Boa sorte.



--

Leonardo Santagada

Rodrigo Dias Arruda Senra

unread,
Jan 21, 2013, 9:10:24 PM1/21/13
to python...@googlegroups.com
[ Gustavo W ]:
---------------------
>Obrigado pela resposta Rodrigo,
>Poderia me explicar melhor?

Manipular sockets pela API de sockets é trabalhoso.
Existem vários livros que explicam isso, normalmente em C (mas o
mapeamento para Python seria 1-1), eu gosto do livro do Stevens [1].
Mas eu **não acho** que vc deva ir por aí.


Recomendo vc dar uma lida em http://twistedmatrix.com/trac/, que é
um framework assíncrono de mais alto nível para vc escrever protocolos.

Faça seu programa funcionar isoladamente da preocupação de criar um serviço
Windows. Depois que ele estiver 100% aí vc pode se preocupar com transformá-lo
em um serviço. O service start irá disparar o servidor, o service stop irá enviar
uma mensagem ao servidor para que ele cometa "suicídio".
Leia [2]

[1] http://www.kohala.com/start/
TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP, and the UNIX Domain Protocols, Addison-Wesley, 1996.
TCP/IP Illustrated, Volume 2: The Implementation, Addison-Wesley, 1995.
TCP/IP Illustrated, Volume 1: The Protocols, Addison-Wesley, 1994.

[2] http://code.activestate.com/recipes/576451-how-to-create-a-windows-service-in-python/
http://code.activestate.com/recipes/551780-win-services-helper/
http://code.activestate.com/recipes/59872-manipulating-windows-services/

Abração
Senra

http://rodrigo.senra.nom.br
Reply all
Reply to author
Forward
0 new messages