从boost python导入相关的python库

时间:2013-09-10 19:54:22

标签: c++ python boost boost-python

所以我使用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模块的目录中执行terminal命令,这就完美无缺。但是,如果我从任何其他目录调用它,我会收到错误

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正在运行。

有谁知道该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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