2

所以我使用 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。

有谁知道该怎么做?

谢谢!

4

1 回答 1

2

如果B.so链接反对A.so,则A.so需要在B.so加载时动态链接器使用的路径中。例如,在导入 module 之前B,将包含的路径添加A.soLD_LIBRARY_PATH环境变量中。

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

考虑查阅动态链接器手册以获取有关加载库时检查的路径的更多信息。

于 2013-09-11T16:24:26.170 回答