ctypes.cdll.loadlibrary忽略ld_library_path env变量
我有一个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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论