PyInstaller打包时无法包含win10toast库的问题求助
我尝试制作一个简单的提醒EXE,代码如下:
import win10toast toaster = win10toast.ToastNotifier() toaster.show_toast("Title", "Testing alert")
使用如下bat脚本通过PyInstaller进行打包:
@echo off cd /d "D:\General Software\PycharmProjects\Project1\venv\Scripts" call activate.bat cd /d "%~dp0" pyinstaller --onefile alert_test.py pause
运行打包后的程序时出现错误:pkg_resources.DistributionNotFound: The 'win10toast' distribution was not found and is required by the application。即使添加--hidden-import win10toast参数仍无法解决。我知道可以使用onedir模式后手动复制库,但想了解问题根源,请问有人知道原因吗?
win10toast依赖检测机制特殊:win10toast内部并非仅依赖模块导入,而是通过
pkg_resources验证自身的分发包是否存在。PyInstaller默认只会收集代码中显式导入的模块文件,不会自动生成pkg_resources所需的包元数据(如dist-info目录),所以即使添加--hidden-import,也只能让模块文件被打包,无法满足分发包的验证要求。--onefile模式的局限性:采用
--onefile模式时,所有文件会被打包成单个可执行文件,运行时临时解压到系统临时目录。但win10toast需要的包元数据不会被自动包含进这个临时环境,导致pkg_resources找不到对应的分发信息,触发错误。而onedir模式下程序文件直接存放在目录中,手动复制库的元数据目录后,pkg_resources就能正常识别。虚拟环境激活的有效性:需确认bat脚本中虚拟环境是否正确激活。如果激活步骤执行不彻底,PyInstaller可能调用全局环境的工具,导致打包时未正确读取虚拟环境中win10toast的完整信息,进而遗漏必要的文件或元数据。
内容的提问来源于stack exchange,提问作者Haski

