Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从boostpython导入依赖的python库_C++_Python_Boost_Boost Python - Fatal编程技术网

C++ 从boostpython导入依赖的python库

C++ 从boostpython导入依赖的python库,c++,python,boost,boost-python,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/scr

因此,我使用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
文件“path/to/python/script.py”,第6行,在
进口B
导入错误:dlopen(路径/to/B.so,2):库未加载:A.so
引用自:路径/to/B
原因:找不到图像
请注意,它在“导入B”时失败,因此sys.path.append命令将其定向到正确的位置。出于某种原因,boost::python库不在sys.path目录中查找?有没有办法设定这个?我尝试在boostpython中添加路径,但这似乎只会在库的编译时起作用,而不会在python运行时起作用

有人知道该怎么做吗


谢谢

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

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


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

为什么要打开库?您可以在compile中设置依赖项time@balki:dlopen是导入行为的一部分。如果没有静态地解释解释器中的扩展,那么动态语言的解释器会如何加载C++库?