Pythonで簡単にWindowsサービスを作る
目次
Pythonで書いた処理をバックグラウンドで動かしておきたいときに、Windowsサービスとして書いておくとPC起動時の自動起動や開始・停止が簡単にできます。
PythonでWindowsサービスを書くにはpywin32モジュールを使うと簡単です。
コード
次のコードで、1秒毎に日付をファイルに出力するサービスが作れます。好きな処理をさせるにはwhileの中身を変えます。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import win32serviceutil | |
| class SampleService(win32serviceutil.ServiceFramework): | |
| _svc_name_ = 'SampleService' | |
| _svc_display_name_ = 'Sample Service' | |
| _svc_description_ = 'This is Sample service.' | |
| def SvcDoRun(self): | |
| self.run = True | |
| while self.run: | |
| # Write datetime.now() every second | |
| import time, datetime | |
| time.sleep(1) | |
| open(r'C:\test.txt', 'a').write('%s\n' % datetime.datetime.now()) | |
| def SvcStop(self): | |
| self.run = False | |
| if __name__ == '__main__': | |
| win32serviceutil.HandleCommandLine(SampleService) |
サービスではターミナルに情報を出力できないので、ファイルやWindowsイベントログなどに出力しましょう。
コマンドラインオプション
スプリクトを直接実行した場合はwin32serviceutil.HandleCommandLine()が呼ばれ、サービスの登録や開始といったいくつかのコマンドラインオプションが指定可能です。
以下の例以外のオプションもあります。オプション無しでスプリクトを実行するとオプション一覧が表示されます。
サービスの登録
python service.py install
サービスの登録に必要なのは、以下の2つです。
_svc_name_: サービス名_svc_display_name_: 表示名
サービスの開始
python service.py start
サービスが開始されると、SvcDoRun()がメインスレッドから呼ばれます。
SvcDoRun()が終了するとサービスが終了してしまうので、サービスの停止が指示されるまでwhileループを回すなどして処理を続ける必要があります。
サービスの停止
python service.py stop
サービスが停止されると、SvcStop()がメインスレッドとは別のスレッドから呼ばれます。上の例ではサービス停止時にself.runを偽にすることで処理を止めています。