下面是完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误的攻略。
问题描述
在使用pyinstaller打包Python程序时,如果程序中有使用pypiwin32或pywin32-ctypes等扩展库,那么在打包时就会报错找不到依赖。错误大概的形式为:
ModuleNotFoundError: No module named 'win32api'
或
OSError: [WinError 126] 找不到指定模块。
问题分析
pypiwin32和pywin32-ctypes都是用来扩展Python在Windows系统上的功能,比如操作Windows注册表等。它们依赖于Windows系统的一些DLL库,并且这些DLL库需要在打包时一起打包到可执行文件中。但是pyinstaller在打包时,默认是不会自动打包依赖的,需要手动配置。
解决方案
方案一:手动打包依赖
手动打包依赖需要使用pyinstaller的--add-binary
参数,将依赖的DLL文件添加到打包后的文件夹中。比如下面的命令:
pyinstaller --add-binary "C:\Python38\Lib\site-packages\win32\win32api.pyd;win32" main.py
这个命令将会把win32api.pyd这个DLL文件和main.py一起打包,并且将win32api.pyd放到可执行文件所在的win32文件夹中。
但是因为pypiwin32和pywin32-ctypes有很多依赖,手动添加所有的依赖DLL文件是极其繁琐的,而且容易出错。所以我们推荐使用方案二。
方案二:使用pywin32-ctypes打包工具
pywin32-ctypes是一个专门用来解决pypiwin32和pywin32-ctypes依赖打包问题的工具,可以自动打包所有依赖的DLL文件,非常方便。
安装pywin32-ctypes工具的命令为:
pip install pywin32-ctypes
然后打包的命令为:
python -m PyInstaller --noconfirm --additional-hooks-dir=<PythonPath>/Lib/site-packages/pywin32_ctypes/hooks/ --name=<Name> --onefile <ScriptPath>
其中<PythonPath>
为Python的安装路径,<Name>
为可执行文件的名字,<ScriptPath>
为待打包的Python脚本的路径。
下面是一个例子:
python -m PyInstaller --noconfirm --additional-hooks-dir=C:/Python38/Lib/site-packages/pywin32_ctypes/hooks/ --name=test --onefile main.py
这个命令会自动打包pypiwin32和pywin32-ctypes所有依赖的DLL文件,而且不需要手动添加任何参数。
总结
使用pypiwin32和pywin32-ctypes扩展库时,很容易出现打包时找不到依赖的问题。为了避免这个问题,我们介绍了两种解决方案。手动打包依赖虽然可行,但是容易繁琐并且出错率高,所以我们推荐使用pywin32-ctypes打包工具来解决问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误 - Python技术站