当前位置: 首页 > news >正文

打包导入pyzbar的脚本时的注意事项

目录

  • 前言
  • 问题
    • 问题的出现
    • 解决
  • 总结


本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。
因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修改本段文字。
违者必究,谢谢配合。
个人主页:blog.csdn.net/jzwalliser

前言

上次用python写了个二维码扫描器(哈哈顺便推销一下:制作二维码扫描器),核心功能使用了pyzbar来实现,用于扫描二维码。但是很不幸,在打包的时候出现了一些状况。

问题

问题的出现

正常来说,如果我们要用pyinstaller以单文件模式打包一个文件,那么肯定是运行pyinstaller -F --hidden-import <module1> --hidden-import <module2> -i <icon> 之类的命令。这回也不例外,我运行了:

pyinstaller -F -w --hidden-import PIL --hidden-import tkinter --hidden-import pyperclip --hidden-import pyzbar -i icon.ico --add-data=icon_clear.ico:. QRCodeReader.py

可是当我双击运行打包好的exe时,却弹出了错误提示:

Traceback (most recent call last):File "PyInstaller\loader\pyimod03_ctypes.py", line 53, in __init__File "ctypes\__init__.py", line 374, in __init__
FileNotFoundError: Could not find module 'libiconv.dll' (or one of its dependencies). Try using the full path with constructor syntax.The above exception was the direct cause of the following exception:Traceback (most recent call last):File "pyzbar\zbar_library.py", line 58, in loadFile "pyzbar\zbar_library.py", line 50, in load_objectsFile "pyzbar\zbar_library.py", line 51, in <listcomp>File "ctypes\__init__.py", line 452, in LoadLibraryFile "PyInstaller\loader\pyimod03_ctypes.py", line 55, in __init__
pyimod03_ctypes.install.<locals>.PyInstallerImportError: Failed to load dynlib/dll 'libiconv.dll'. Most likely 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 "PyInstaller\loader\pyimod03_ctypes.py", line 53, in __init__File "ctypes\__init__.py", line 374, in __init__
FileNotFoundError: Could not find module 'C:\Users\Lenovo\AppData\Local\Temp\_MEI204842\pyzbar\libiconv.dll' (or one of its dependencies). Try using the full path with constructor syntax.The above exception was the direct cause of the following exception:Traceback (most recent call last):File "QRCodeReader.py", line 7, in <module>File "<frozen importlib._bootstrap>", line 1007, in _find_and_loadFile "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlockedFile "<frozen importlib._bootstrap>", line 680, in _load_unlockedFile "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_moduleFile "pyzbar\pyzbar.py", line 7, in <module>File "<frozen importlib._bootstrap>", line 1007, in _find_and_loadFile "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlockedFile "<frozen importlib._bootstrap>", line 680, in _load_unlockedFile "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_moduleFile "pyzbar\wrapper.py", line 151, in <module>File "pyzbar\wrapper.py", line 148, in zbar_functionFile "pyzbar\wrapper.py", line 127, in load_libzbarFile "pyzbar\zbar_library.py", line 60, in loadFile "pyzbar\zbar_library.py", line 50, in load_objectsFile "pyzbar\zbar_library.py", line 51, in <listcomp>File "ctypes\__init__.py", line 452, in LoadLibraryFile "PyInstaller\loader\pyimod03_ctypes.py", line 55, in __init__
pyimod03_ctypes.install.<locals>.PyInstallerImportError: Failed to load dynlib/dll 'C:\\Users\\Lenovo\\AppData\\Local\\Temp\\_MEI204842\\pyzbar\\libiconv.dll'. Most likely this dynlib/dll was not found when the application was frozen.
[3252] Failed to execute script 'QRCodeReader' due to unhandled exception!

大概意思是无法加载pyzbar/libiconv.dll。什么叫无法加载?我用pyinstxtract.py将刚才打包好的exe拆了开来,结果发现里面根本就没有pyzbar这个文件夹,更别提libiconv.dll了。

此时我脑残似的从网上随便找了一个libiconv.dll下载,然后打包进去。可依然没用。

解决

再仔细观察抛出的异常,里面有这么一句话:

Could not find module ‘libiconv.dll’ (or one of its dependencies).

这下懂了:无法加载libiconv.dll可能是因为没有libiconv.dll,也可能是因为缺少libiconv.dll的依赖项而导致的

此时终于恍然大悟:既然libiconv.dll并没有缺失(刚才不是打包进去了嘛),那很可能是因为缺少依赖导致。终于,我在C:\Users\Lenovo\AppData\Local\Programs\Python\Python39\Lib\site-packages\pyzbar下找到了另外一个dll文件:libzbar-64.dll。将这个dll文件也打包进去,终于没问题了!

所以,最终那个程序的打包命令是:

pyinstaller -F -w --hidden-import PIL --hidden-import tkinter --hidden-import pyperclip --hidden-import pyzbar -i icon.ico --add-data=icon_clear.ico:. --add-data=libiconv.dll:./pyzbar/ --add-data=libzbar-64.dll:./pyzbar/ QRCodeReader.py

大家也可以参考一下。

总结

所以如果想用pyinstaller打包和pyzbar有关的脚本,请提前将C:\Users\Lenovo\AppData\Local\Programs\Python\Python39\Lib\site-packages\pyzbar文件夹下的libiconv.dlllibzbar-64.dll复制到工作目录下,并在打包命令中添加--add-data=libzbar-64.dll:./pyzbar/ --add-data=libiconv.dll:./pyzbar/两个参数。

http://www.lryc.cn/news/394250.html

相关文章:

  • 02-android studio实现下拉列表+单选框+年月日功能
  • 曹操的五色棋布阵 - 工厂方法模式
  • 谷粒商城学习笔记-逆向工程错误记录
  • FastAPI+SQLAlchemy数据库连接
  • Android中的适配器,你知道是做什么的吗?
  • GitHub详解:代码托管与协作开发平台
  • 【植物大战僵尸杂交版】获取+存档插件
  • BP神经网络与反向传播算法在深度学习中的应用
  • 【数据结构与算法】插入排序
  • MySQL如何实现数据排序
  • 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】
  • 【Python】基于动态规划和K聚类的彩色图片压缩算法
  • 【做一道算一道】和为 K 的子数组
  • Facebook应用开发:认证与授权登录流程详解
  • 实战:搭建一款属于自己的个人知识库~docusaurus(强大且丝滑)-2024.7.7(测试成功)
  • Java教程之IO模式精讲,NIO+BIO
  • 如何让代码兼容 Python 2 和 Python 3?Future 库助你一臂之力
  • AI让大龄程序员重新焕发活力
  • Python在现代办公自动化中的应用:会不会被裁?就看你的效率了!
  • Laravel5+mycat 报错 “Packets out of order”
  • 使用androidx.appcompat:appcompat:1.7.0无法运行的问题
  • 基于Java的水果商品销售网站
  • Redis 线程模型
  • 栈和队列---循环队列
  • 打卡第4天----链表
  • 07-7.1.1 查找的基本概念
  • 【数据结构与算法】快速排序双指针法
  • GESP C++一级真题
  • 短信验证码实现
  • pnpm的坑