涉及外部日志配置文件时服务启动失败

Service fails to start when external log config file is involved

我正在使用 PyInstaller 将我的多模块 Python 应用程序捆绑到 one-file exe 中。此应用程序的入口点是扩展 win32serviceutil.ServiceFramework 的模块——因此这意味着 运行 作为 Windows 服务。当我尝试使用此应用程序提供用户可配置的记录器 ini 文件时出现问题。在我的主模块中,我设置了记录器,

log_file_path = path.join(path.dirname(path.abspath(__file__)), 'logging.conf')
logging.config.fileConfig(log_file_path)

我的 PyInstaller 命令如下:

pyinstaller -F <main-file>.py -n <exe-name> --hidden-import=win32timezone --add-data "logging.conf;."

打包后,我将生成的 exe 安装为服务,并成功注册为 Windows 服务。但是,当我尝试启动它时,它失败了。

有趣的是,在我配置的位置创建了一个空日志文件。所以这意味着 1) 应用程序确实读取了我的配置文件,并且 2) 这里没有权限问题。有没有人试过设置这样的东西来帮助阐明我可能遗漏的东西?

在 PyInstaller 中使用 one-file 选项时,我们无法在代码中有效地使用 __file__ 变量来识别捆绑的应用程序或其位置。相反,PyInstaller 在 运行 时设置特殊的系统变量,如 sys._MEIPASSsys.executable;分别指定引导加载程序为应用程序创建的临时文件夹 运行,以及冻结的可执行文件(引导加载程序)的位置。

一旦我改变我的路径操作以使用这些变量来定位日志配置文件,该文件被成功读取并且服务工作。