所以我使用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正在运行。
有谁知道该怎么办?
谢谢!
答案 0 :(得分:2)
如果B.so
链接到A.so
,则A.so
需要位于加载B.so
时动态链接器使用的路径中。例如,在导入模块B
之前,请将包含A.so
的路径添加到LD_LIBRARY_PATH
环境变量中。
库和模块之间存在区别。 A.so
是一个库,而不是一个模块。在尝试导入模块时,Python最终可能会尝试加载库,要求库初始化模块。在这种情况下,库A.so
在Python解释器加载时初始化模块A
。 sys.path
的文档声明它指定了模块的搜索路径。因此,import B
会将B.so
视为import
和sys.path
行为的一部分。但是,当动态链接器加载B.so
时,动态链接器而不是Python解释器需要解析A.so
。
请考虑咨询动态链接器的manual,以获取有关加载库时检查的路径的更多信息。