ctypes.cdll.loadlibrary忽略ld_library_path env变量

发布于 2025-02-08 13:43:21 字数 2091 浏览 4 评论 0原文

我有一个C ++动态库,该库使用另一组动态库(VLC LIB), 当我尝试在Python中加载库(libmylib.dylib)时:

import ctypes
lib = ctypes.cdll.LoadLibrary('./libmylib.dylib')

我会得到一个错误:

  File "test.py", line 5, in <module>
    lib = ctypes.cdll.LoadLibrary('./libmylib.dylib')
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/ctypes/__init__.py", line 443, in LoadLibrary
    return self._dlltype(name)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/ctypes/__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(./libmylib.dylib, 0x0006): Library not loaded: @rpath/libvlc.dylib
  Referenced from: ./libmylib.dylib
  Reason: tried: '/usr/local/lib/libvlc.dylib' (no such file), '/usr/lib/libvlc.dylib' (no such file)

为了使其正常工作,我必须明确加载VLC依赖关系库:

import ctypes
ctypes.cdll.LoadLibrary('/Applications/VLC.app/Contents/MacOS/lib/libvlccore.dylib')
ctypes.cdll.LoadLibrary('/Applications/VLC.app/Contents/MacOS/lib/libvlc.dylib')
lib = ctypes.cdll.LoadLibrary('./libmylib.dylib')

我尝试设置ld_library_path ld_library_path < /code> and library_path没有运气的环境变量:

VLC_PLUGIN_PATH=/Applications/VLC.app/Contents/MacOS/plugins
LD_LIBRARY_PATH=/Applications/VLC.app/Contents/MacOS/lib/
RUN_LD_PATH=/Applications/VLC.app/Contents/MacOS/lib/
LIBRARY_PATH=/Applications/VLC.app/Contents/MacOS/lib/

是否可以通过位置(目录)找到VLC动态库的位置(目录),并避免使用ctypes.cdll明确加载它们。 LoadLibrary? 如何?

注意:我在此实验中使用的操作系统是MacOS Monterey 12.4,而我使用的Python版本为:3.8.9

更新

outtup of:

DYLD_LIBRARY_PATH=/Applications/VLC.app/Contents/MacOS/lib python3 -c 'import os; print(os.environ.get("DYLD_LIBRARY_PATH"))'
None

note none,所有dyld_*库是完全被忽略,似乎与此问题

I have a C++ dynamic library which use another set of dynamic library(VLC lib),
when I then try to load the library(libmylib.dylib) in python with:

import ctypes
lib = ctypes.cdll.LoadLibrary('./libmylib.dylib')

I get an error like:

  File "test.py", line 5, in <module>
    lib = ctypes.cdll.LoadLibrary('./libmylib.dylib')
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/ctypes/__init__.py", line 443, in LoadLibrary
    return self._dlltype(name)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/ctypes/__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(./libmylib.dylib, 0x0006): Library not loaded: @rpath/libvlc.dylib
  Referenced from: ./libmylib.dylib
  Reason: tried: '/usr/local/lib/libvlc.dylib' (no such file), '/usr/lib/libvlc.dylib' (no such file)

In order to make it work, I have to explicitly load the VLC dependency libraries:

import ctypes
ctypes.cdll.LoadLibrary('/Applications/VLC.app/Contents/MacOS/lib/libvlccore.dylib')
ctypes.cdll.LoadLibrary('/Applications/VLC.app/Contents/MacOS/lib/libvlc.dylib')
lib = ctypes.cdll.LoadLibrary('./libmylib.dylib')

I have tried to set LD_LIBRARY_PATH and LIBRARY_PATH environment variables with no luck:

VLC_PLUGIN_PATH=/Applications/VLC.app/Contents/MacOS/plugins
LD_LIBRARY_PATH=/Applications/VLC.app/Contents/MacOS/lib/
RUN_LD_PATH=/Applications/VLC.app/Contents/MacOS/lib/
LIBRARY_PATH=/Applications/VLC.app/Contents/MacOS/lib/

Is there a way to pass the location(directory) where the VLC dynamic libraries are located and avoid to load them explicitly with ctypes.cdll.LoadLibrary ?
How?

Note: the OS I'm using for this experiment is macOS Monterey 12.4, while the version of python I'm using is: 3.8.9

Update

Output of:

DYLD_LIBRARY_PATH=/Applications/VLC.app/Contents/MacOS/lib python3 -c 'import os; print(os.environ.get("DYLD_LIBRARY_PATH"))'
None

it is none, all DYLD_* libraries are completely ignored, seems to be related to this issue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文