pyinstaller打包exe文件闪退的解决办法
pyinstaller是python下目前能打包py文件为windows下的exe文件的一个非常友好易用的库!但是,小爬每次用pyinstaller打包时也总是遇到一些难题,有时网上搜了一圈,也没看到合适的答案。小爬因此决定把我的问题和后来的解决思路都写出来,供后来者参考!
事情是这样的,小爬最近编写了一个发票PDF文件的识别脚本:1、用到PyMuPDF中的fitz模块来提取发票的二维码图片元素;2、用到pyzbar来提取二维码信息;3、用pdfplumber(该库依赖于pdfminer.six库)来提取PDF文件中的文本和表格数据;4、用Pillow库对处理图像对象。
脚本写完后,可以正常地在Visual Studio Code下跑出结果,符合预期。用pyinstaller打包为单个exe文件的过程看上去很“完美”,但是封装后的exe文件每次执行都闪退,错误信息如下:
Traceback (most recent call last):
File "lib\site-packages\PyInstaller\loader\pyiboot01_bootstrap.py", line , in __init__
File "ctypes\__init__.py", line , in __init__
OSError: [WinError ] 找不到指定的模块。 During handling of the above exception, another exception occurred: Traceback (most recent call last):
File "lib\site-packages\pyzbar\zbar_library.py", line , in load
File "lib\site-packages\pyzbar\zbar_library.py", line , in load_objects
File "lib\site-packages\pyzbar\zbar_library.py", line , in <listcomp>
File "ctypes\__init__.py", line , in LoadLibrary
File "lib\site-packages\PyInstaller\loader\pyiboot01_bootstrap.py", line , in __init__
__main__.PyInstallerImportError: Failed to load dynlib/dll 'libiconv.dll'. Most probably this dynlib/dll was not found when the application was frozen. During handling of the above exception, another exception occurred: Traceback (most recent call last):
File "lib\site-packages\PyInstaller\loader\pyiboot01_bootstrap.py", line , in __init__
File "ctypes\__init__.py", line , in __init__
OSError: [WinError ] 找不到指定的模块。 During handling of the above exception, another exception occurred: Traceback (most recent call last):
File "tel_Fee_Invoice_Info_Extract.py", line , in <module>
import pyzbar.pyzbar as pyzbar
File "<frozen importlib._bootstrap>", line , in _find_and_load
File "<frozen importlib._bootstrap>", line , in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line , in _load_unlocked
File "d:\settlement_env\venv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line , in exec_module
exec(bytecode, module.__dict__)
File "lib\site-packages\pyzbar\pyzbar.py", line , in <module>
File "<frozen importlib._bootstrap>", line , in _find_and_load
File "<frozen importlib._bootstrap>", line , in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line , in _load_unlocked
File "d:\settlement_env\venv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line , in exec_module
exec(bytecode, module.__dict__)
File "lib\site-packages\pyzbar\wrapper.py", line , in <module>
File "lib\site-packages\pyzbar\wrapper.py", line , in zbar_function
File "lib\site-packages\pyzbar\wrapper.py", line , in load_libzbar
File "lib\site-packages\pyzbar\zbar_library.py", line , in load
File "lib\site-packages\pyzbar\zbar_library.py", line , in load_objects
File "lib\site-packages\pyzbar\zbar_library.py", line , in <listcomp>
File "ctypes\__init__.py", line , in LoadLibrary
File "lib\site-packages\PyInstaller\loader\pyiboot01_bootstrap.py", line , in __init__
__main__.PyInstallerImportError: Failed to load dynlib/dll 'C:\\Users\\newjune\\AppData\\Local\\Temp\\_MEI164962\\pyzbar\\libiconv.dll'. Most probably this dynlib/dll was not found when the application was frozen.
[] Failed to execute script tel_Fee_Invoice_Info_Extract
该traceback看是在说 缺少"ctypes\__init__.py" 模块,实际上,经过它的提示,我们能在对应的路径下找到该模块,并不能发现什么异常。这段报错信息的倒数第二行
”Failed to load dynlib/dll 'C:\\Users\\newjune\\AppData\\Local\\Temp\\_MEI164962\\pyzbar\\libiconv.dll'. Most probably this dynlib/dll was not found when the application was frozen.“
,似乎在暗示该exe文件,每次执行的时候,会在计算机本地的Temp文件下生成一个临时文件夹,其中,要调用的动态链接库文件”libiconv.dll“找不到,改库是二维码解析库 pyzbar要运行的必要依赖文件。
我们在venv的虚拟环境下对应的文件夹”\venv\Lib\site-packages\pyzbar“ 下可以找到它:
小爬这次决定试试pyinstaller的打包为文件夹功能,不再打包为单个exe文件:使用pyinstaller -D your.py 语句即可。果不其然,该方法下打包也很顺利,但是生成的文件夹下,我们可以看到很多的依赖文件和pyd文件。
最重要的一点,对应的exe文件执行时候报错跟上面的traceback错误信息是一样的。这个生成的文件夹下已经包含了诸多的windows下需要的dll文件,但是并没有我们要的”pyzbar\\libiconv.dll",小爬决定将上文找到的文件夹整个复制到该工具目录下。再次运行,此时程序可以正常运行,但是在提取pdf文件的文本信息时,滤掉了所有的中文字符,只能显示字母、数字和特殊符号。小爬马上联想到,这是缺少PDF中文字符的解码包。联想到 我使用的pdfplumber 库是基于 pdfminer.six库 二次开发。我们再次找到 pdfminer.six所在的文件夹:
该子文件夹”cmap“中存储着大量的PDF字符解码包:
小爬猜想这就是我们程序需要的,pyinstaller在打包的过程中再次漏掉了引用这些解码包。小爬再次将整个pdfminer文件夹拷贝到 程序的根目录下,这次,再次运行exe文件,已经可以完美执行,大功告成。小爬猜想,pyinstaller只是没有成功封装 这些第三方依赖文件,但是py文件应该已经封装过。为此,小爬删除了pdfminer文件夹和pyzbar文件夹下的所有py文件,再次运行工具,依旧完美执行!
照理说,此时,该工具已经达到了预期的目的,但是小爬还是想把整个含exe核心文件的文件夹打包成一个单独的exe可执行文件,有没有办法做到呢?办法当然有,我们需要用到 ”Enigma Virtual Box“该文件。它能帮我们很方便的实现该功能:
注意事项就一点:该工具支持直接将我们的目录拖拽到virtual box Files 树内,一键生成目录树,不需要手工创建节点!
至此,大功告成,如果您也遇到和小爬一样的pyinstaller打包问题,不妨参照上面的方法试一试!
pyinstaller打包exe文件闪退的解决办法的更多相关文章
- pyinstaller打包exe文件,运行时一闪而过
pyinstaller打包exe文件出现命令窗口一闪而过 原因:exe运行过程中出错了,解决这些错误就可以了 解决方法: 通过 cd path >> xxx.exe 在命令行中运行exe文 ...
- windows10中git-bash闪退的解决办法
windows10中git-bash闪退的解决办法 出现错误详情 Windows10 64位专业版安装git .18之后出现 Git闪退,报错信息:bash: /dev/null: No such d ...
- 利用PyInstaller打包exe文件
前言 平常我们通过Python写完一些小脚本之后,如果使用不频繁的话,一般会选择在DOS界面直接跑脚本,或者在IDE中运行.但当我们需要频繁使用某些脚本,或者在没有Python环境的机器上也能顺利运行 ...
- Ubuntu使用MyEclipse闪退的解决办法
修改myeclipse.ini文件, -Xmx512m-XX:MaxPermSize=512m-XX:ReservedCodeCacheSize=256m-Dosgi.nls.warnings=ign ...
- 关于启动MongDB的mongod.exe文件闪退的问题
昨天学mongdb的时候,遇到了mongod.exe闪退的问题,解决办法很简单: 你可以不执行mongod.exe,直接用命令行操作 在你安装mongdb的盘的根目录下创建一个data文件夹,一定要在 ...
- pyinstaller 打包.exe文件记录遇到的问题
用pyinstaller打包py2.7的程序有时会出现不匹配的错误,在python的idle下运行没有问题,打包之后却会报一些错误,所以打包的话还是尽量用py3.5版本,而且用 -F 将程序打包成一个 ...
- 某些编辑器运行C程序闪退的解决办法
在某些C语言编辑器中运行C语言程序或点击生成的.exe文件出现闪退现象的解决办法,主要有两种,还有其它方法欢迎交流. 包含头文件<windows.h>,在程序末尾添加system(&quo ...
- 关于ArcMap中打开ArcToolbox导致闪退的解决办法
最近好久不用ArcGis的小编要用到ArcMap去发送一个GP服务,发现按照套路打开ArcMap点击ArcToolbox时,发生了ArcMap的闪退现象,几经周折终于解决了问题. 希望也遇到这类问题的 ...
- discuz2.5登录后台闪退的解决办法
今天突然发现discuz2.5论坛后台进不去,开始以为密码错了,但发现登录后也是闪退.我试着清除浏览器cookie,也换了其他浏览器也没有用,还是上网找找吧! discuz2.5进入后台闪退的原因: ...
随机推荐
- 原生js扫雷代码
思路要点: 1. 随机地雷放到一个二维数组中: 2. 每一个格子要统计周围有几颗雷: 3. 每一个格子是否处于打开状态,用于判断是否赢得游戏: 4. 如果点击到周围没有雷的地方,把周围的打开: 具体的 ...
- Revit安装失败怎样卸载重新安装Revit,解决Revit安装失败的方法总结
技术帖:Revit没有按照正确方式卸载,导致Revit安装失败.楼主也查过网上关于如何解决Revit安装失败的一些文章,是说删除几个Revit文件和Revit软件注册表就可以解决Revit安装失败的问 ...
- mysql 查询当天、昨天、本周、上周、本月、上月、今年、去年数据
mysql查询今天.昨天.7天.近30天.本月.上一月 数据 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT ...
- Libev源码分析07:Linux下的eventfd简介
#include <sys/eventfd.h> int eventfd(unsigned int initval, int flags); eventfd创建一个eventfd对象,该对 ...
- 【Android内存机制分析】了解Android堆和栈
昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题.以前也出现过这个问题,那时候并没有深究.这次打算好好分析一下Android的内存机制. 因为我以前是做VC+ ...
- php parse_url linux 解析问题
耕毅 解析url函数parse_url() (PHP 4, PHP 5, PHP 7) parse_url — 解析 URL,返回其组成部分 mixed parse_url ( string $url ...
- BLOB类型对应Long binary,CLOB对应Long characters
BLOB类型对应Long binary,CLOB对应Long characters
- Project Euler Problem 15-Lattice paths
组合数,2n中选n个.向右走有n步,向下走有n步.共2n步.有n步是向右走的,计算向右走的这n步的所有情况,即C(2n,n). 或者,每一步,只能从右边或者上边走过来,只有这两种情况,即step[i] ...
- C++第5次作业
运算符重载 定义 - 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同行为. 运算符重载规则 - C++运算符除了少数几个,全都可以重载,且只能重载C++已有的运算 ...
- laravel博客后台操作步骤