记录pyinstaller 打包 pdfplumber 问题解决过程

今天有一个pdf文件处理需求,使用pdfplumber库完成,python环境是3.11+win10 pyinstaller 5.10.1

打包完成后,工具可以顺利打开,但是执行处理的时候报错

  File "pypdfium2_raw\bindings.py", line 93, in <module>
  File "pypdfium2_raw\bindings.py", line 83, in _register_library
  File "pypdfium2_raw\bindings.py", line 78, in _find_library
ImportError: Could not find library 'pdfium' in ['.'] (system search disabled)

跟随报错找到了库pypdfium2_raw, 看这个意思是这个pdfium.ll没有打包进去

首先使用--add-data把这个dll文件打包进去,还是一样提示报错

感觉可能这个pypdfium2_raw没导入进去,就是用--hidden-import把这个库导入,照样报错

第二次感觉可能是这个dll文件算二进制文件,要用--add-binary导入,结果还是报错

这种情况也没怎么处理过,就找资料,先看下pyinstaller的帮助

usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME] [--add-data <SRC;DEST or SRC:DEST>]
                   [--add-binary <SRC;DEST or SRC:DEST>] [-p DIR] [--hidden-import MODULENAME]
                   [--collect-submodules MODULENAME] [--collect-data MODULENAME] [--collect-binaries MODULENAME]
                   [--collect-all MODULENAME] [--copy-metadata PACKAGENAME] [--recursive-copy-metadata PACKAGENAME]
                   [--additional-hooks-dir HOOKSPATH] [--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
                   [--splash IMAGE_FILE] [-d {all,imports,bootloader,noarchive}] [--python-option PYTHON_OPTION] [-s]
                   [--noupx] [--upx-exclude FILE] [-c] [-w]
                   [-i <FILE.ico or FILE.exe,ID or FILE.icns or Image or "NONE">] [--disable-windowed-traceback]
                   [--version-file FILE] [-m <FILE or XML>] [--no-embed-manifest] [-r RESOURCE] [--uac-admin]
                   [--uac-uiaccess] [--win-private-assemblies] [--win-no-prefer-redirects] [--argv-emulation]
                   [--osx-bundle-identifier BUNDLE_IDENTIFIER] [--target-architecture ARCH]
                   [--codesign-identity IDENTITY] [--osx-entitlements-file FILENAME] [--runtime-tmpdir PATH]
                   [--bootloader-ignore-signals] [--distpath DIR] [--workpath WORKPATH] [-y] [--upx-dir UPX_DIR] [-a]
                   [--clean] [--log-level LEVEL]
                   scriptname [scriptname ...]

常规的打包参数一个个看过来,看到有4个以--collect-开头的指令,找了相关说明

--collect-submodules MODULENAME
                        收集指定包或模块的所有子模块。此选项可以多次使用。
--collect-data MODULENAME
                        收集指定包或模块的所有数据文件。此选项可以多次使用。
--collect-binaries MODULENAME
                        收集指定包或模块的所有二进制文件。此选项可以多次使用。
--collect-all MODULENAME
                        收集指定包或模块的所有子模块、数据文件和二进制文件。此选项可以多次使用。

看样子应该就是打包的时候没把dll文件打包进去,因为python用的是pyd文件,可能dll文件直接被忽略了

那么简单点就直接--collect-all 试试,果然,不报刚才的错了,换了另一个错

  File "pypdfium2\version.py", line 45, in api_tag
  File "pypdfium2\version.py", line 45, in <genexpr>
  File "functools.py", line 1001, in __get__
  File "pypdfium2\version.py", line 26, in _data
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\****\\AppData\\Local\\Temp\\_MEI47962\\pypdfium2\\version.json'

看提示是另一个库的version文件没有

这个简单,把另一个库的文件也收集进去--collect-all=pypdfium2_raw  --collect-all=pypdfium2,使用了这2个参数,这2个库的文件都会被打包进去

打包完成运行就不在报错了,至此完成了此次打包报错的修复

总结:pyinstaller打包会忽略python以为的文件格式,比如json,dll之类的,一般库的文件信息都写到py文件里面,dll库的话也是window平台的专用格式,python相关的是pyd

所以这种情况就需要手动指定将对应库的文件全部采集打包进去。

 

posted @ 2024-02-23 15:05  darkspr  阅读(89)  评论(0编辑  收藏  举报