PyInstaller针对本地导入的hidden-import参数使用问题
PyInstaller打包Apryse SDK时ModuleNotFoundError的解决办法
问题详情
打包后运行exe出现以下报错:
File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "apryse_sdk\__init__.py", line 17, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "PDFNetPython3\__init__.py", line 17, in <module> ModuleNotFoundError: No module named 'PDFNetPython'
主脚本导入语句:
from apryse_sdk import *
apryse_sdk/__init__.py中的嵌套导入:
from PDFNetPython import *
模块文件结构(位于C:\Program Files\Anaconda2022\Lib\site-packages\apryse_sdk):
Directory: C:\Program Files\Anaconda2022\Lib\site-packages\apryse_sdk Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 9/11/2023 12:56 PM __pycache__ -a---- 9/7/2023 1:13 PM 45508632 PDFNetC.dll -a---- 9/7/2023 1:13 PM 12 PDFNetPyLibInfo -a---- 9/7/2023 1:13 PM 658347 PDFNetPython.py -a---- 9/7/2023 1:13 PM 7536128 _PDFNetPython.pyd -a---- 9/11/2023 1:33 PM 474 __init__.py
解决办法
1. 用--hidden-import指定本地模块
--hidden-import参数完全适用于本地同目录模块,它的作用是强制PyInstaller将未被自动检测到的模块加入打包范围。执行打包命令时添加该参数:
pyinstaller --hidden-import=PDFNetPython your_script.py
2. 手动添加二进制依赖文件
除了Python模块,PDFNetC.dll、_PDFNetPython.pyd这类二进制文件是Apryse SDK运行必需的,PyInstaller通常不会自动识别,需要用--add-data参数(Windows下用;分隔路径,Linux/macOS用:):
pyinstaller --hidden-import=PDFNetPython ^ --add-data "C:\Program Files\Anaconda2022\Lib\site-packages\apryse_sdk\PDFNetC.dll;." ^ --add-data "C:\Program Files\Anaconda2022\Lib\site-packages\apryse_sdk\_PDFNetPython.pyd;." ^ --add-data "C:\Program Files\Anaconda2022\Lib\site-packages\apryse_sdk\PDFNetPyLibInfo;." ^ your_script.py
3. 编辑.spec文件实现自定义打包
如果命令行参数过多,可先生成.spec配置文件,再编辑内容:
- 生成.spec文件:
pyi-makespec your_script.py
- 打开生成的
your_script.spec,修改以下部分:- 在
hiddenimports列表中添加'PDFNetPython' - 在
datas列表中添加所有依赖的非Python文件:
datas=[ ('C:\\Program Files\\Anaconda2022\\Lib\\site-packages\\apryse_sdk\\PDFNetC.dll', '.'), ('C:\\Program Files\\Anaconda2022\\Lib\\site-packages\\apryse_sdk\\_PDFNetPython.pyd', '.'), ('C:\\Program Files\\Anaconda2022\\Lib\\site-packages\\apryse_sdk\\PDFNetPyLibInfo', '.'), ] - 在
- 用.spec文件打包:
pyinstaller your_script.spec
内容的提问来源于stack exchange,提问作者Sterling Butters
相关产品推荐
相关产品推荐

