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文件闪退的解决办法的更多相关文章

  1. pyinstaller打包exe文件,运行时一闪而过

    pyinstaller打包exe文件出现命令窗口一闪而过 原因:exe运行过程中出错了,解决这些错误就可以了 解决方法: 通过 cd path >> xxx.exe 在命令行中运行exe文 ...

  2. windows10中git-bash闪退的解决办法

    windows10中git-bash闪退的解决办法 出现错误详情 Windows10 64位专业版安装git .18之后出现 Git闪退,报错信息:bash: /dev/null: No such d ...

  3. 利用PyInstaller打包exe文件

    前言 平常我们通过Python写完一些小脚本之后,如果使用不频繁的话,一般会选择在DOS界面直接跑脚本,或者在IDE中运行.但当我们需要频繁使用某些脚本,或者在没有Python环境的机器上也能顺利运行 ...

  4. Ubuntu使用MyEclipse闪退的解决办法

    修改myeclipse.ini文件, -Xmx512m-XX:MaxPermSize=512m-XX:ReservedCodeCacheSize=256m-Dosgi.nls.warnings=ign ...

  5. 关于启动MongDB的mongod.exe文件闪退的问题

    昨天学mongdb的时候,遇到了mongod.exe闪退的问题,解决办法很简单: 你可以不执行mongod.exe,直接用命令行操作 在你安装mongdb的盘的根目录下创建一个data文件夹,一定要在 ...

  6. pyinstaller 打包.exe文件记录遇到的问题

    用pyinstaller打包py2.7的程序有时会出现不匹配的错误,在python的idle下运行没有问题,打包之后却会报一些错误,所以打包的话还是尽量用py3.5版本,而且用 -F 将程序打包成一个 ...

  7. 某些编辑器运行C程序闪退的解决办法

    在某些C语言编辑器中运行C语言程序或点击生成的.exe文件出现闪退现象的解决办法,主要有两种,还有其它方法欢迎交流. 包含头文件<windows.h>,在程序末尾添加system(&quo ...

  8. 关于ArcMap中打开ArcToolbox导致闪退的解决办法

    最近好久不用ArcGis的小编要用到ArcMap去发送一个GP服务,发现按照套路打开ArcMap点击ArcToolbox时,发生了ArcMap的闪退现象,几经周折终于解决了问题. 希望也遇到这类问题的 ...

  9. discuz2.5登录后台闪退的解决办法

    今天突然发现discuz2.5论坛后台进不去,开始以为密码错了,但发现登录后也是闪退.我试着清除浏览器cookie,也换了其他浏览器也没有用,还是上网找找吧! discuz2.5进入后台闪退的原因: ...

随机推荐

  1. 巨蟒python全栈开发-第11阶段 ansible_project3

    今日大纲: 1.用户创建 2.前端优化 3.用户编辑 4.用户删除 5.ansible api介绍 1.用户创建 新建一个user_create.html的页面 <form class=&quo ...

  2. SGU 103 Traffic Lights【最短路】

    题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=16530 题意: 给定每个点最初的颜色,最初颜色持续时间,以 ...

  3. AbstractExecutorService的submit方法概要介绍

    1.概述 ExecutorService是JDK提供的框架,它简化了异步模式下的任务执行.一般来说,ExecutorService会自动提供一个线程池和API,用于为其分配任务. 2.实例化Execu ...

  4. 直击 KubeCon 现场 | 阿里云 Hands-on Workshop 亮点回顾

    相关文章链接[合集]规模化落地云原生,阿里云亮相 KubeCon China沉淀九年,一文看清阿里云原生大事件 2019 年 6 月 24 日至 26 日,KubeCon + CloudNativeC ...

  5. CENTOS7安装R语言环境

    CENTOS7安装R语言环境 yum install texinfo.x86_64 yum install texlive.x86_64 cd /opt wget https://mirrors.tu ...

  6. MySQL_连表查询

    连表查询 连表查询通常分为内连接和外连接.内连接就是使用INNER JOIN进行连表查询:而外连接又分为三种连接方式,分别是左连接(LEFT JOIN).右连接(RIGHT JOIN).全连接(FUL ...

  7. TAE words all

    // vol 1   could do with sth   rhinoplasty   angst   the wee small hours   familial   Munich   gladi ...

  8. HDU 1864 01背包、

    这题题意有点坑阿.感觉特别模糊. 我开始有一点没理解清楚.就是报销的话是整张整张支票报销的.也是我傻逼了 没一点常识 还有一点就是说单张支票总额不超过1000,每张支票中单类总额不超过600,我开始以 ...

  9. Python--day65--模板语言之变量相关语法

    Django的模板语言: 1.目前已经学过的模板语言: 2,模板语言总结: 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Djan ...

  10. element-ui隐藏组件el-scrollbar

    代码如下: <div class="main_wrapper"> <el-scrollbar wrapClass="scrollar_container ...