为macOS下的ctypes.util.find_library()指定路径

2024-04-25 16:31:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我想为^{}指定一个要搜索的路径。我该怎么做

我想在Python中从开始

我在用macOS

如果我想从Python外部执行此操作,我可以使用LD_LIBRARY_PATH指定位置。但是,我已经读到,我不能在Python中将这个环境变量修改为it is cached on Python's startup。修改值然后重新启动Python似乎是一个非常无用的想法;例如,如果库是在执行过程中导入的,会发生什么情况

我为什么要这样做?因为我想在Windows下工作的Python库中添加一个MacOS控制盘。目前,他们正在将DLL打包到与Python源文件相同的目录中,并将该路径添加到Windows的path环境中,该环境进行ctypes.util.find_library()搜索——这是一种我似乎无法在Mac下复制的技术

我试着去理解。它似乎表明Python库不依赖于任何共享对象。我怀疑这是因为dylib是使用ctypes.util.find_library()动态加载的,而不是在Python中编译代码

如有任何建议,我们将不胜感激


Tags: path路径环境iswindowsutillibrary环境变量
1条回答
网友
1楼 · 发布于 2024-04-25 16:31:31

尽管有一些环境变量(LD_LIBRARY_PATHDYLD_LIBRARY_PATH)会影响共享库的搜索路径,但在Python启动时,它们会被Python读取并修复。因此,这一选择被取消

相反,我们采取了Python documentation中暗示的方法:

If wrapping a shared library with ctypes, it may be better to determine the shared library name at development time, and hardcode that into the wrapper module instead of using find_library() to locate the library at runtime.

我们对每个操作系统包含的库的名称进行了硬编码,此外,我们还为未包含库的操作系统添加了一个通用名称:

names = {
    "Windows": "libogg.dll",
    "Darwin": "libogg.0.dylib",
    "external": "ogg"
}

库加载代码检查是否可以找到当前操作系统的指定库。如果不成功,则搜索“外部”库

库加载代码可以在PyOgg项目中找到;见Library.load()

此外,受delocate project的启发,我们需要编辑在某些dylib中找到的路径。例如,我们编辑了opusfile二进制文件以指向在我们的包中找到的ogg二进制文件:

install_name_tool -change /usr/local/opt/libogg/lib/libogg.0.dylib @loader_path/libogg.0.dylib libopusfile.0.dylib

有关此过程的详细信息,请参阅PyOgg项目中与macOS二进制文件关联的README file

关于该方法的进一步讨论可以在PyOgg的GitHub页面(#32)上提出的问题中找到

相关问题 更多 >