【Python】在conda虚拟环境里使用pyinstaller打包python程序报错,打包出来的应用一直提示“找不到指定的程序”,已解决!

问题描述

在使用 Anaconda 虚拟环境时,通过 PyInstaller 打包 Python 程序可能会遇到某些导入的库未被正确打包的情况。以下是我遇到的具体问题:

在 Anaconda Prompt 中切换到目标虚拟环境及对应路径后,使用以下命令进行打包:

pyinstaller --onefile --windowed window.py
# 或
pyinstaller --onefile --windowed --hidden-import win32gui window.py
# 或
pyinstaller -F --paths=D:\software\anaconda3\envs\mhxy\Lib\site-packages --python=D:\software\anaconda3\envs\mhxy\python.exe --windowed window.py

虽然能够成功生成 exe 文件,但在运行时出现如下错误提示:

Failed to execute script 'window' due to unhandled exception: DLL load failed while importing win32gui: 找不到指定的程序。
Traceback (most recent call last):
File "window.py", line 3, in <module>
ImportError: DLL load failed while importing win32gui: 找不到指定的程序。



解决方式

经过数小时的探索,最终找到了解决方法。

问题根源在于:PyInstaller 在打包过程中会静态分析代码中显式通过 `import`导入的模块,但无法识别动态导入的模块(例如使用 `importlib`或延迟导入等机制)。例如:

import win32gui

该模块在运行时还会动态导入 win32apiwin32conpywintypes等依赖。由于 PyInstaller 未能自动检测到这些隐式依赖,导致它们未被包含在最终打包文件中,运行时就可能出现:

ImportError: DLL load failed while importing win32gui

故只需要使用--hidden-import 将缺失的模块手动添加进去,那么完整的导入命令就变成了:

pyinstaller --onefile --windowed ^
 --hidden-import=win32api ^
 --hidden-import=win32con ^
 --hidden-import=win32gui ^
 --hidden-import=pywintypes ^
 --paths=D:\software\anaconda3\envs\mhxy\Lib\site-packages ^
 --add-binary "D:\software\anaconda3\envs\mhxy\Lib\site-packages\pywin32_system32\*.dll;pywin32_system32" ^ 
window.py

注:命令中的 ^是 Windows CMD 的续行符,用于提高可读性,实际使用时可以省略。

参数说明:

--onefile:将所有依赖打包成一个独立的可执行文件(.exe)。
    
--windowed:创建窗口应用程序(不显示控制台窗口),适用于带 GUI 的程序(如使用 Tkinter 等);如为命令行程序可省略。
    
--hidden-import:指定 PyInstaller 未能自动检测到的模块。
    
--paths:指定额外的模块搜索路径,此处指向虚拟环境中的 `site-packages`目录。
    
--add-binary:将非 Python 文件(如 DLL、图像、配置文件等)加入打包结果,格式为 `"源路径;目标目录"`。
    

通过补充上述依赖,重新打包后的程序即可正常运行。


小插曲

当我把上述问题解决以后,又遇到了另一个问题。。。

运行打包出来的程序报错

虚拟环境安装的 Tkinter 是 8.6.13,但是使用Pyinstaller打包时加载的库却要求是8.6.14

知道问题就很好办了

解决方法如下:

1. 通过命令 `python -m tkinter`查看当前 Tkinter 版本信息;
2. 使用 `conda uninstall tkinter`卸载原有版本;    
3. 通过 `conda install tk=8.6.14`安装指定版本的 Tkinter 库。

重新执行打包命令后,程序运行正常。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值