使用 pyinstaller 构建 exe 时未找到 APScheduler pytz-deprecation-shim

Posted

技术标签:

【中文标题】使用 pyinstaller 构建 exe 时未找到 APScheduler pytz-deprecation-shim【英文标题】:APScheduler pytz-deprecation-shim not found when building an exe with pyinstaller 【发布时间】:2022-01-08 01:31:30 【问题描述】:

运行我使用 pyinstaller 构建的 exe 时,每次在程序中使用 APScheduler 时都会出错。

pkg_resources.DistributionNotFound: The 'pytz-deprecation-shim' distribution was not found and is required by tzlocal

我之前已经遇到过类似的问题:pytz、tzlocal 和 APScheduler 似乎使用的六个,但我可以通过创建一个 hook-pytz.py hook-tzlocal.py hook-six.py 文件来解决这个问题,每个文件都包含以下代码对应分布:

from PyInstaller.utils.hooks import copy_metadata, collect_data_files

datas = copy_metadata('pytz')
datas += collect_data_files('pytz')

使用 pyinstaller 构建应用程序时,我会调用 --additional-hooks-dir= 但是,现在相同的过程不适用于 pytz-deprecation-shim,因为我总是收到相同的错误。我该如何解决这个问题?我已经尝试将所有这些软件包升级到最新版本,但它们似乎是最新的。

版本: pytz 2021.3, pytz-deprecation-shim 0.1.0.post0, tzlocal 4.1, 六个 1.16.0, APScheduler 3.8.1

【问题讨论】:

APScheduler 版本为 3.8.1 【参考方案1】:

我今天也遇到了这个问题。

我的解决方案是使用 APScheduler 3.6.3。

这是我的hook-apscheduler.py

datas = copy_metadata('apscheduler', recursive=True)
hiddenimports = collect_submodules('apscheduler')

【讨论】:

嗨,谢谢它对我有用。但是,您如何处理 tzdata 问题。如果不将代码 --collect-all tzdata 粘贴到我的 pyinstaller 命令中,程序将再次崩溃。如果我这样做,一切正常,但.exe 显然总是使用我的设备拥有的时区,但如果我分发它,则不是所有其他用户之一。有什么解决办法吗? 首先,命令-collect-all tzdata 与创建hook-tzdata.py 效果相同。二、推荐使用--additional-hooks-dir命令指定文件夹中的多个包,类似于hook-tzdata.py,因为这样可以指定多个包,而--collect all只能指定一个包.三、如何指定时区,可以这样: 从 tzlocal 导入 get_localzone local_tz = get_localzone() scheduler = BackgroundScheduler(timezone=local_tz)

以上是关于使用 pyinstaller 构建 exe 时未找到 APScheduler pytz-deprecation-shim的主要内容,如果未能解决你的问题,请参考以下文章

PyInstaller 构建的 Windows EXE 因多处理而失败

导出单个 .exe 时,PyInstaller 卡在“正在构建 PKG ...”

如何使用pyinstaller打包32位的exe

pyinstaller exe黑屏

如何使用pyinstaller打包32位的exe

使用 PyInstaller 创建的 .exe 文件不显示其 GUI