Macos 当pyinstaller看到冲突版本时手动指定库

Macos 当pyinstaller看到冲突版本时手动指定库,macos,pyinstaller,Macos,Pyinstaller,在使用pyinstaller时,是否可以在Mac OSX上手动替换或指定.dylib的位置 尝试打开已完成的.app时出错 Traceback (most recent call last): File "DeepMeerkat/main.py", line 3, in <module> import cv2 File "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py

在使用pyinstaller时,是否可以在Mac OSX上手动替换或指定.dylib的位置

尝试打开已完成的.app时出错

Traceback (most recent call last):
  File "DeepMeerkat/main.py", line 3, in <module>
    import cv2
  File "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 546, in load_module
    module = imp.load_module(fullname, fp, filename, ext_tuple)
ImportError: dlopen(/Users/ben/Documents/DeepMeerkat/Installer/dist/Lib/cv2.so, 2): Library not loaded: @loader_path/libpng16.16.dylib
  Referenced from: /Users/ben/Documents/DeepMeerkat/Installer/dist/Lib/libopencv_imgcodecs.3.3.dylib
  Reason: Incompatible library version: libopencv_imgcodecs.3.3.dylib requires version 48.0.0 or later, but libpng16.16.dylib provides version 45.0.0
Failed to execute script main
回溯(最近一次呼叫最后一次):
文件“DeepMeerkat/main.py”,第3行,在
进口cv2
文件“/Library/Python/2.7/site packages/PyInstaller/loader/pyimod03\u importers.py”,第546行,在load\u模块中
module=imp.load_module(全名、fp、文件名、ext_元组)
导入错误:dlopen(/Users/ben/Documents/DeepMeerkat/Installer/dist/Lib/cv2.so,2):未加载库:@loader_path/libpng16.16.dylib
引用自:/Users/ben/Documents/DeepMeerkat/Installer/dist/Lib/libopencv_imgcodecs.3.3.dylib
原因:库版本不兼容:libopencv_imgcodecs.3.3.dylib需要48.0.0或更高版本,但libpng16.16.dylib提供45.0.0版本
无法执行主脚本
我在应用程序之外用python加载cv2没有问题,或者在使用自制软件安装的open时没有任何其他问题

仔细想想,我认为这个错误极有可能来自pyinstaller从X11(
/opt/X11/include/libpng16
)抓取libpng,而它需要从自制的文件夹(
/usr/local/cillar/libpng/1.6.32/
)抓取libpng


如何使用钩子指定我想要哪个libpng?

我也有同样的问题,答案在于编辑.spec文件。在a=Analysis…(分析)后添加以下行:

a.binaries = a.binaries - TOC([('libpng16.16.dylib',None,None)])

这会从相关TOC文件中删除有问题的动态库,从而解决冲突。

手动替换该文件会起作用,但无法很好地扩展。我会保持开放。这个修复程序可以工作,而且(不幸的是)在macos 10.14.6上运行时,仍然与Python3.7、pyinstaller 3.5相关。是的,Python3.7、pyinstaller 3.6版在这里。这起作用了。