

# 問題点

下記の質問において、サービスプログラムの作成・実行が成功しましたが、新たな問題点が発生しました。  
[pyenv+venv
環境でpywin32によるサービス開始ができない原因について](https://ja.stackoverflow.com/questions/94163/pyenvvenv-%e7%92%b0%e5%a2%83%e3%81%a7pywin32%e3%81%ab%e3%82%88%e3%82%8b%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e9%96%8b%e5%a7%8b%e3%81%8c%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%84%e5%8e%9f%e5%9b%a0%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6)

サービスをデバッグモードで実行する：ログフォルダ作成・ログ出力が成功する。  
サービスをスタート実行する。：ログフォルダ作成・ログ出力ともできていない。（エラーは出ない。）

# 質問内容

デバッグモードでは正常であることから、Pythonソースコード自体は特に問題がないと推測しています。  
サービス実行状態ならではの何らかの工夫が必要なのでしょうか？

# 環境

項目 | 内容  
---|---  
OS | Windows10 pro  
python(pyenv+venv) | 3.9.10  
pip | ver.23.0.1  
pywin32 | ver.305  
pyinstaller | 5.9.0  
  
# ソースコード

[code]

    import win32serviceutil
    import win32service
    import win32event
    import servicemanager
    import logging
    import logging.handlers
    import os
    import pathlib
    import sys
    import time
    
    
    def _logger_():
        log_path = os.getenv("TEMP") + "\\test_pywin32_service\\test-service.log"
        if not os.path.exists(log_path):
            ret_path = os.path.split(log_path)
            pathlib.Path(ret_path[0]).mkdir(
                parents=True,
                exist_ok=True
            )
    
        logging_format = '%(asctime)s %(threadName)s %(levelname)s:%(message)s'
        formatter = logging.Formatter(logging_format)
    
        root = logging.getLogger()
    
        handler = logging.handlers.RotatingFileHandler(
            filename=log_path,
            mode="a",
            maxBytes=1*1024*1024,
            backupCount=2,
        )
        handler.setFormatter(formatter)
        root.addHandler(handler)
        root.setLevel('DEBUG')
    
        return root
    
    
    class test_pywin32_service(win32serviceutil.ServiceFramework):
        # サービス名
        _svc_name_ = "test_pywin32_service"
        # 表示名(サービス画面にはこれを表示)
        _svc_display_name_ = "TEST Service"
        # サービスの説明
        _svc_description_ = '一定周期でログを出力する'
        # シグナルまでの待ち用タイムアウト時間(今回は10秒 = 10,000ミリ秒)
        _timeout_Milliseconds = 10000
    
        def __init__(self, args):
            self.logger = _logger_()
            self.logger.info('init')
            win32serviceutil.ServiceFramework.__init__(self, args)
            self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
    
        def SvcStop(self):
            self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
            win32event.SetEvent(self.hWaitStop)
    
        def SvcDoRun(self):
            self.logger.info('run')
            servicemanager.LogMsg(
                servicemanager.EVENTLOG_INFORMATION_TYPE,
                servicemanager.PYS_SERVICE_STARTED,
                (self._svc_name_, '')
            )
    
            self.logger.info('start')
    
            while True:
                self.logger.info('alive')
                # イベントのシグナル化を10秒待つ
                ret = win32event.WaitForSingleObject(
                    self.hWaitStop,
                    self._timeout_Milliseconds
                )
                # サービス停止(イベントがシグナル化)ならば、処理を中止
                if ret == win32event.WAIT_OBJECT_0:
                    break
    
                time.sleep(1)
    
            self.logger.info('finish')
    
    
    if __name__ == '__main__':
        if len(sys.argv) == 1:
            servicemanager.Initialize()
            servicemanager.PrepareToHostSingle(test_pywin32_service)
            servicemanager.StartServiceCtrlDispatcher()
        else:
            win32serviceutil.HandleCommandLine(test_pywin32_service)
    
    
[/code]

# サービス登録まで

[code]

    PyInstaller --hiddenimport win32timezone -F .\source\app.py
    
[/code]

[code]

    .\dist\app.exe install
    
[/code]

# デバッグ実行

[code]

    .\dist\app.exe debug
    
[/code]

# 通常の実行

[code]

    .\dist\app.exe start
    
[/code]


CC BY-SA 4.0
2023-03-14T06:35:36.127
94166
2023-03-14T06:35:36.127
32891
question
python windows-10 pyinstaller pywin32
Windowsサービスプログラムで、デバッグモードと実行結果が異なるのはなぜでしょうか？