【问题标题】:Importing dependent python libraries from boost python从 boost python 导入依赖的 python 库
【发布时间】:2013-09-10 19:54:22
【问题描述】:

所以我使用 boost::python: 创建了两个模块:

BOOST_PYTHON_MODULE(A) { ... }
BOOST_PYTHON_MODULE(B) { ... }

这样 B 依赖于 A。然后我尝试使用 python 代码调用它们:

import sys
sys.path.append('path/to/modules/')

import A
import B

... # python body

最后我从终端调用 python 脚本:

python path/to/python/script.py

只要我从安装 boost::python 模块的目录中执行终端命令,它就可以完美地工作。但是,如果我从任何其他目录调用它,我会收到错误

File "path/to/python/script.py", line 6, in <module>
    import B
 importError: dlopen(path/to/B.so, 2): Library not loaded: A.so
 Referenced from: path/to/B.so
 Reason: image not found

注意,它在“import B”上失败,所以 sys.path.append 命令将它引导到正确的位置。出于某种原因,boost::python 库不在 sys.path 目录中查找?有没有办法设置这个?我尝试在 boost python 中添加路径,但这似乎只影响库的编译时的东西,而不是 python 正在运行。

有人知道该怎么做吗?

谢谢!

【问题讨论】:

  • 为什么要 dlopen 库?您可以在编译时设置依赖项
  • @balki:dlopenimport 行为的一部分。如果在解释器中没有静态链接扩展,动态语言的解释器将如何加载 C++ 库?

标签: c++ python boost boost-python


【解决方案1】:

如果B.so 链接到A.so,则A.so 需要位于加载B.so 时动态链接器使用的路径中。例如,在导入模块B之前,将包含A.so的路径添加到LD_LIBRARY_PATH环境变量中。

库和模块之间是有区别的。 A.so 是一个库,而不是一个模块。当尝试导入一个模块时,Python 最终可能会尝试加载一个库,要求该库初始化一个模块。在这种情况下,库A.so 会在Python 解释器加载模块A 时对其进行初始化。 sys.path 的文档声明它指定了 modules 的搜索路径。因此,import B 将发现 B.so 作为 importsys.path 行为的一部分。但是,当动态链接器加载 B.so 时,动态链接器而不是 Python 解释器需要解析 A.so

请考虑咨询动态链接器的manual,以获取有关加载库时检查的路径的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 2011-05-25
    • 1970-01-01
    • 2023-02-20
    • 2016-06-11
    • 2019-08-17
    • 2023-01-26
    相关资源
    最近更新 更多