使用PyInstaller将Python脚本转为.exe时遇libiconv.dll加载错误
PyInstaller打包含pyzbar脚本时libiconv.dll加载失败的解决方案
问题详情
运行打包生成的exe时出现如下错误回溯:
Traceback (most recent call last): File "PyInstaller\loader\pyimod03_ctypes.py", line 53, in __init__ File "ctypes\__init__.py", line 376, in __init__ OSError: [WinError 193] %1 is not a valid Win32 application The above exception was the direct cause of the following exception: Traceback (most recent call last): File "pyzbar\zbar_library.py", line 58, in load File "pyzbar\zbar_library.py", line 50, in load_objects File "pyzbar\zbar_library.py", line 51, in <listcomp> File "ctypes\__init__.py", line 454, in LoadLibrary File "PyInstaller\loader\pyimod03_ctypes.py", line 55, in __init__ pyimod03_ctypes.install.<locals>.PyInstallerImportError: Failed to load dynlib/dll 'C:\\Users\\ahmedb\\AppData\\Local\\Temp\\_MEI315562\\libiconv.dll'. Most likely this dynlib/dll was not found when the application was frozen. During the 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 376, in __init__ OSError: [WinError 193] %1 is not a valid Win32 application The above exception was the direct cause of the following exception: Traceback (most recent call last): File "New_project.py", line 16, in <module> File "<frozen importlib._bootstrap>", line 1178, in _find_and_load File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "pyzbar\pyzbar.py", line 7, in <module> File "<frozen importlib._bootstrap>", line 1178, in _find_and_load File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "pyzbar\wrapper.py", line 151, in <module> File "pyzbar\wrapper.py", line 148, in zbar_function File "pyzbar\wrapper.py", line 127, in load_libzbar File "pyzbar\zbar_library.py", line 60, in load File "pyzbar\zbar_library.py", line 50, in load_objects File "pyzbar\zbar_library.py", line 51, in <listcomp> File "ctypes\__init__.py", line 454, in LoadLibrary File "PyInstaller\loader\pyimod03_ctypes.py", line 55, in __init__ pyimod03_ctypes.install.<locals>.PyInstallerImportError: Failed to load dynlib/dll C:\\Users\\ahmedb\\AppData\\Local\\Temp\\_MEI315562\\libiconv.dll'. Most likely this dynlib/dll was not found when the application was frozen.
使用的打包命令:
pyinstaller --noconfirm --onefile --windowed --icon "C:/Users/ahmedb/Desktop/app/logo.ico" --add-data "C:/Users/ahmedb/Desktop/app/haarcascade_frontalface_default.xml;." --add-binary "C:/Users/ahmedb/Desktop/app/libiconv.dll;." "C:/Users/ahmedb/Desktop/app/New_project.py"
解决方案
- 匹配dll与Python的位数
WinError193核心原因是32位dll和64位Python环境不兼容,反之亦然。先确认Python位数:
在命令行执行:
python -c "import sys; print(sys.maxsize > 2**32)"
返回True为64位,False为32位。下载对应位数的libiconv.dll替换脚本目录中的现有文件。
使用pyzbar自带的dll文件
pyzbar安装包自带适配的dll文件,找到Python环境下的Lib\site-packages\pyzbar文件夹(比如C:\Users\ahmedb\AppData\Local\Programs\Python\PythonXX\Lib\site-packages\pyzbar),复制里面的libiconv.dll和libzbar.dll到脚本目录,然后修改打包命令的--add-binary参数指向这些文件。修正打包命令的路径格式
Windows下建议用反斜杠作为路径分隔符,或者确保正斜杠路径正确。简化后的打包命令示例:
pyinstaller --noconfirm --onefile --windowed --icon "C:\Users\ahmedb\Desktop\app\logo.ico" --add-data "C:\Users\ahmedb\Desktop\app\haarcascade_frontalface_default.xml;." --add-binary "libiconv.dll;." "C:\Users\ahmedb\Desktop\app\New_project.py"
- 通过spec文件手动配置dll
- 生成基础spec文件:
pyinstaller --name MyApp --onefile --windowed "C:/Users/ahmedb/Desktop/app/New_project.py"
- 打开生成的
MyApp.spec,在binaries列表中添加dll路径:
a = Analysis( ['C:/Users/ahmedb/Desktop/app/New_project.py'], pathex=[], binaries=[ ('C:/Users/ahmedb/Desktop/app/libiconv.dll', '.'), ('C:/Users/ahmedb/AppData/Local/Programs/Python/PythonXX/Lib/site-packages/pyzbar/libzbar.dll', '.') ], datas=[('C:/Users/ahmedb/Desktop/app/haarcascade_frontalface_default.xml', '.')], # 其余配置保持不变 )
- 用spec文件重新打包:
pyinstaller MyApp.spec
- 降级pyzbar版本
部分新版本pyzbar在打包时存在兼容性问题,尝试降级到稳定版本:
pip uninstall pyzbar -y && pip install pyzbar==0.1.9
内容的提问来源于stack exchange,提问作者Ahmed Abdulaziz
相关产品推荐
相关产品推荐

