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进入后台闪退的原因: ...
随机推荐
- wepy —— 组件之间通信
一.props 1.静态传值 —— 父组件向子组件传递常量数据 // 父组件 <coma fruitName="橘子"></coma> // 子组件 // ...
- ListOfOpenSourcePrograms
ListOfOpenSourcePrograms Contents Desktop Applications Communication Engineering Educational Financi ...
- python特性(八):生成器对象的send方法
生成器对象是一个迭代器.但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法.这些方法,主要是用于外部与生成器对象的交互.本文先介绍send方法. send方法有一个参 ...
- 20182019-acmicpc-asia-dhaka-regional F .Path Intersection 树链剖分
直接进行树链剖分,每次对路径区间内的所有点值+1,线段树进行维护,然后查询线段树的最大值的个数!!! 查询线段树区间最大值个数,可以先维护区间和,在维护区间最值,如果区间和等于区间最值乘以区间长度,那 ...
- 洛谷 2152 [SDOI2009]SuperGCD
Description Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比赛计算GCD.有一天Sheng bill很嚣张地找到了你,并要 ...
- Spring Boot 集成日志logback + 控制台打印SQL
一: 控制台打印SQL application.properties中添加如下即可在控制台打印sql logging.level.com.fx.fxxt.mapper=debug 二:日志 因为Spr ...
- Element-ui学习笔记3--Form表单(三)
InputNumber <el-input-number v-model="num" @change="handleChange" :min=" ...
- hdu 1556 Color the ball(区间更新,单点求值)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 1716 排序2(dfs)
排列2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- java 文件读写工具 FileUtil
代码如下: package com.wiscom.utils; import java.io.BufferedReader; import java.io.File; import java.io.F ...