【问题标题】:Service fails to start when external log config file is involved涉及外部日志配置文件时服务无法启动
【发布时间】:2019-06-29 00:03:56
【问题描述】:

我正在使用 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) 这里没有权限问题。有没有人尝试设置这样的东西来帮助阐明我可能缺少的东西?

【问题讨论】:

  • 嗨,有什么例外?
  • @jspcal 我只是从 Windows 收到“服务没有及时响应控制请求”消息。未指示异常或调用堆栈。

标签: python windows-services pyinstaller python-logging


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2016-01-09
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多