1. ホーム
  2. パイソン

[解決済み】WindowsでPythonスクリプトをサービスとして実行するにはどうすればいいですか?

2022-03-29 16:37:58

質問

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

そのサービスを実装する技術として、現在PythonとDjangoフレームワークを目指しています。LinuxでPythonのプログラムをデーモン化する方法は、だいたい分かっています。しかし、Windowsに対応することがオプションの仕様項目になっています。私はWindowsのプログラミングの経験がほとんどなく、Windowsのサービスも全く経験がありません。

PythonのプログラムをWindowsのサービスとして実行する(ユーザーログインなしで自動的に実行する)ことは可能ですか? この部分は必ずしも実装する必要はないのですが、この路線で設計するかどうかを決めるために、どのようにするのか大まかなイメージが欲しいのです。

編集部:これまでの回答、ありがとうございました。もうひとつ教えていただきたいことがあります。 Windowsはどのように私のサービスを認識しているのでしょうか?Windowsネイティブのユーティリティで管理できますか? etc/init.d に start/stop スクリプトを記述するのと同等の効果がありますか?

どのように解決するのですか?

はい、できます。私は、以下のものに付属するpythoncomライブラリを使用しています。 ActivePython でインストールすることもできます。 パイウィン32 (Python for Windows extensions)を使用します。

これは簡単なサービスの基本的なスケルトンです。

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 メソッド