gpt4 book ai didi

python - Python 包内共享 C 库的路径无关管理

转载 作者:行者123 更新时间:2023-11-28 18:54:19 25 4
gpt4 key购买 nike

假设我有一个名为 Foo 的包是这样组织的:

Foo\
__init__.py
foo.py
bar.py
lib\
libwhatever.so

我的模块 foo.py 使用 python ctypes 来包装我的 libwhatever.lib 中包含的 C 方法,这涉及检查库是否在它应该在的位置。 2个问题:

1) 如何在我的包中检查所需的 lib 是否在它的位置(在 Foo\lib 中),无论整个 Foo 包放置在哪里?

现在,我的库的路径是硬编码的,但随着我稍后分发东西,问题会来。

2) 然后我有模块 bar.py,它在 libwhatever 中打包了一个较慢的 Python 版本的 C 例程。无论 libwhatever 的导入是否失败,我都想使用它们。有没有一种方法可以根据库导入的成功或失败在例程的 C 版本和 Python 版本之间进行抽象切换?

提前感谢您的建议。

最佳答案

假设您使用的是 Linux,我认为您必须将该 .so 文件添加到您的库搜索路径,或者将模块目录添加到您的路径。看看 ldconfig。 man ldconfig。一旦你做了其中任何一个,你就可以使用 ctypes.util.find_library()。否则,您必须拥有 .so 文件的完整路径才能使用 cdll()

我认为我会做的只是在运行时构建该路径 - 所以有点像这样:

from ctypes import CDLL
import Foo
try:
MyLib = CDLL(Foo.__path__[0] + '/lib/libwhatever.so')
except OSError:
from Foo import bar as MyLib

虽然,可能有更好的方法......

关于python - Python 包内共享 C 库的路径无关管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6189498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com