PyInstaller打包EXE需指定参数运行,求无需手动的解决方案
问题现象
运行PyInstaller打包生成的EXE文件时,出现以下错误:
Traceback (most recent call last):
File "main.py", line 7, in
File "", line 1360, in _find_and_load
File "", line 1331, in _find_and_load_unlocked
File "", line 935, in load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
File "prophet_init.py", line 12, in
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\ERWIN\AppData\Local\Temp\_MEI188562\prophet\version.py'
已知通过命令python -m main.exe -Xfrozen_modules=off可正常运行程序,但不想使用批处理文件,修改spec文件、代码自动执行命令均无效。
有效解决方案
1. 修改Spec文件同时处理文件缺失与冻结模块问题
编辑PyInstaller生成的.spec文件,进行两处关键修改:
- 添加
__version__.py到datas列表,确保打包时包含该文件:
可通过datas=[('{你的prophet包路径}/__version__.py', 'prophet')],pip show prophet查看Location字段,拼接prophet目录得到实际路径。 - 在
EXE配置段添加环境变量禁用冻结模块:
修改完成后,重新执行打包命令:EXE( pyz, a.scripts, a.binaries, a.datas, [], name='main', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, # 根据项目需求调整为False env={'PYTHONFROZENMODULES': '0'} )pyinstaller main.spec
2. 在代码中提前注入版本信息并禁用冻结模块
在main.py的最顶部添加以下代码,绕过prophet对__version__.py的依赖:
import sys # 禁用冻结模块 sys.flags.frozen_modules = 0 # 手动设置prophet版本(替换为你实际安装的版本号) PROPHET_VERSION = '1.1.5' # 模拟__version__.py模块,提前注入到sys.modules sys.modules['prophet.__version__'] = type('mock_version', (), {'__version__': PROPHET_VERSION})() # 之后再导入prophet及其他依赖 import prophet
完成后重新执行打包:pyinstaller main.py
3. 打包命令直接添加参数禁用冻结模块并包含缺失文件
使用--exclude-module参数禁用冻结模块,同时用--add-data包含__version__.py:
# Windows系统 pyinstaller --exclude-module frozen_modules --add-data "{你的prophet包路径}/__version__.py;prophet" main.py # Linux/macOS系统 pyinstaller --exclude-module frozen_modules --add-data "{你的prophet包路径}/__version__.py:prophet" main.py
内容的提问来源于stack exchange,提问作者Metaverse09

