Windows で Python スクリプトをサービスとして実行するにはどうすればよいですか? 質問する

Windows で Python スクリプトをサービスとして実行するにはどうすればよいですか? 質問する

私は、データベースに格納されているさまざまな相互に関連するオブジェクトを共有する一連のプログラムのアーキテクチャをスケッチしています。プログラムの 1 つを、これらのオブジェクトに対する操作のための高レベル インターフェイスを提供するサービスとして機能させ、他のプログラムがそのサービスを通じてオブジェクトにアクセスできるようにしたいと考えています。

私は現在、そのサービスを実装するためのテクノロジーとして、Python と Django フレームワークを目指しています。Linux で Python プログラムをデーモン化する方法を理解していると思います。ただし、システムが Windows をサポートすることはオプションの仕様項目です。私は Windows プログラミングの経験がほとんどなく、Windows サービスの経験もまったくありません。

Python プログラムを Windows サービスとして実行することは可能ですか (つまり、ユーザー ログインなしで自動的に実行します)?この部分を実装する必要はありませんが、この方向で設計するかどうかを決定するには、どのように実行されるかの大まかなアイデアが必要です。

編集: これまでのすべての回答に感謝します。非常に包括的です。もう 1 つ知りたいことがあります。Windowsはどのようにして私のサービスを認識するのでしょうか。ネイティブの Windows ユーティリティを使用して管理できますか。/etc/init.d に開始/停止スクリプトを配置することに相当するものは何ですか。

ベストアンサー1

はい、できます。私はpythoncomライブラリを使っています。アクティブPythonまたはインストール可能pywin32(Windows 用 Python 拡張機能)。

これは単純なサービスの基本的な骨組みです。

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

おすすめ記事