[python] Windows에서 Python 스크립트를 서비스로 어떻게 실행합니까?

데이터베이스에 저장된 다양한 관련 개체를 공유하는 일련의 프로그램에 대한 아키텍처를 스케치하고 있습니다. 프로그램 중 하나가 이러한 객체에 대한 작업을위한 더 높은 수준의 인터페이스를 제공하는 서비스로 작동하고 다른 프로그램이 해당 서비스를 통해 객체에 액세스하기를 원합니다.

현재 Python 및 Django 프레임 워크를 해당 서비스를 구현하는 기술로 목표로 삼고 있습니다. Linux에서 Python 프로그램을 데몬 화하는 방법을 확실히 알고 있습니다. 그러나 시스템이 Windows를 지원해야하는 것은 선택 사양입니다. Windows 프로그래밍 경험이 거의없고 Windows 서비스 경험이 전혀 없습니다.

Python 프로그램을 Windows 서비스로 실행할 수 있습니까 (예 : 사용자 로그인없이 자동으로 실행)? 필자는이 부분을 반드시 구현할 필요는 없지만 이러한 선을 따라 디자인할지 여부를 결정하려면 어떻게해야하는지 대략적인 아이디어가 필요합니다.

편집 : 지금까지 모든 답변에 감사드립니다. 한 가지 더 알고 싶습니다. Windows는 내 서비스를 어떻게 인식합니까? 기본 Windows 유틸리티로 관리 할 수 ​​있습니까? /etc/init.d에 시작 / 중지 스크립트를 넣는 것과 동등한 것은 무엇입니까?



답변

그래 넌 할수있어. ActivePython에 포함되어 있거나 pywin32 (Python for Windows 확장명) 와 함께 설치할 수있는 pythoncom 라이브러리를 사용하여 수행합니다 .

간단한 서비스를위한 기본 구조입니다.

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)

코드는 main()메소드에 들어갑니다. 일반적으로 SvcStop메소드 에서 설정 한 플래그를 확인하면 중단 될 수있는 무한 루프가 있습니다.


답변

몇 주 전에 선택한 답변을 찬성했지만 그 동안 나는이 주제로 더 많은 어려움을 겪었습니다. 특별한 Python 설치가 있고 서비스로 스크립트를 실행하기 위해 특수 모듈을 사용하는 것은 단순히 잘못된 방법입니다. 휴대 성과 관련하여 어떻습니까?

나는 훌륭한 비 흡입 서비스 관리자를 우연히 발견했습니다. 하여 Windows 서비스를 다루는 것이 정말 간단하고 깔끔했습니다. 옵션을 설치된 서비스에 전달할 수 있기 때문에 파이썬 실행 파일을 선택하고 스크립트를 옵션으로 전달할 수 있다고 생각했습니다.

아직이 솔루션을 시도하지 않았지만 지금 시도하고 프로세스에 따라이 게시물을 업데이트 할 것입니다. 또한 Windows에서 virtualenvs를 사용하는 데 관심이 있으므로 조만간 자습서를 제공하여 여기에 연결할 수 있습니다.


답변

가장 간단한 방법은 다음을 사용하는 것입니다. NSSM-Non-Sucking Service Manager :

1- https://nssm.cc/download에서 다운로드

2-파이썬 프로그램을 서비스로 설치하십시오 : 관리자로 Win 프롬프트

c :> nssm.exe 설치 WinService

3-NSSM 콘솔에서 :

경로 : C : \ Python27 \ Python27.exe

시작 디렉토리 : C : \ Python27

인수 : c : \ WinService.py

4-services.msc에서 작성된 서비스를 확인하십시오.


답변

이를 달성하는 가장 간단한 방법은 기본 명령 sc.exe를 사용하는 것입니다.

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. sc.exe로 서비스를 만들 때 컨텍스트 매개 변수를 전달하는 방법은 무엇입니까?

답변

거의 모든 Windows 실행 파일을 서비스로 설치하기위한 몇 가지 대안이 있습니다.

방법 1 : rktools.exe에서 instsrv 및 srvany 사용

Windows Home Server 또는 Windows Server 2003 (WinXP에서도 작동)의 경우 Windows Server 2003 Resource Kit Tools 에는이를 위해 instsrv.exesrvany.exe 라는 유틸리티가 함께 제공됩니다 . 이러한 유틸리티를 사용하는 방법에 대한 자세한 내용 은이 Microsoft KB 문서 KB137890 을 참조하십시오.

Windows Home Server의 경우 “유용한 모든 서비스 설치 프로그램 ” 이라는 유틸리티를위한 사용자 친화적 인 래퍼가 있습니다.

방법 2 : Windows NT 용 ServiceInstaller 사용

python 명령 과 함께 Windows NT 용 ServiceInstaller ( 여기서 다운로드 가능 )를 사용하는 또 다른 대안이 있습니다 . 이름과 달리 Windows 2000 및 Windows XP에서도 작동합니다. 다음은 파이썬 스크립트를 서비스로 설치하는 방법에 대한 지침입니다.

파이썬 스크립트 설치

ServiceInstaller를 실행하여 새 서비스를 작성하십시오. (이 예제에서는 python이 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

설치 후 제어판의 서비스 애플릿을 열고 PythonTest 서비스를 선택하여 시작하십시오.

초기 답변 후, SO에 이미 게시 된 Q & A와 밀접한 관련이있는 것으로 나타났습니다. 또한보십시오:

Python 스크립트를 서비스로 실행할 수 있습니까 (Windows)? 어떻게?

Python으로 작성한 서비스를 Windows에 알리려면 어떻게해야합니까?


답변

작동 방법에 대한 단계별 설명 :

1- 먼저 위에서 언급 한 기본 골격에 따라 파이썬 파일을 만듭니다. 그리고 예를 들어 “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-이 단계에서 서비스를 등록해야합니다.

관리자 권한으로 명령 프롬프트를 실행 하고 다음과 같이 입력하십시오.

sc create TestService binpath = “C : \ Python36 \ Python.exe c : \ PythonFiles \ AppServerSvc.py”DisplayName = “TestService”start = 자동

binpath 의 첫 번째 인수 는 python.exe경로입니다.

의 두 번째 인수 binpath는 것이다 파이썬 파일의 경로 우리가 이미 만든

= “기호 마다 하나의 공백을 두어야합니다 .

그런 다음 모든 것이 정상이면

[SC] CreateService 성공

이제 파이썬 서비스가 Windows 서비스로 설치되었습니다. Service Manager 및 레지스트리에서 다음을 확인할 수 있습니다.

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ TestService

3- 지금 확인하세요. 서비스 관리자에서 서비스를 시작할 수 있습니다.

이 서비스 스켈레톤을 제공하는 모든 파이썬 파일을 실행할 수 있습니다.


답변

pysc : Python의 서비스 제어 관리자

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()

서비스 생성 및 시작

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'))

서비스 중지 및 삭제

import pysc

service_name = 'test_xmlrpc_server'

pysc.stop(service_name)
pysc.delete(service_name)
pip install pysc