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

标签 python package ctypes

假设我有一个名为 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/

相关文章:

python - 为什么我在安装 daphne 时出现此错误?

Python - 使用正则表达式解析 apache 配置

Java:是否可以关闭包(限制向其中添加类)

linux - 我无法使用 composer 在 Symfony 中安装某些东西

java - 在java中使用数字作为包名

python - 如何在Python Selenium中选择与一个CSS选择器匹配的前N个网站元素?

python - 使用 AppEngine XMPP 进行客户端通知

python - 使用 python 运行未导出的 .dll 函数

c++ - Python Ctypes 崩溃调用 C++ 函数的 C 包装器

python - 如何调用需要指向具有 ctypes 的结构的指针的 c 函数?