如何从Python文件内部导入Boost.Python
How does import work with Boost.Python from inside python files
我正在使用Boost.Python在我的C++可执行文件中嵌入一个解释器,并执行一些预先编写的脚本。我已经让它工作了,这样我就可以调用python文件中的函数,但我想使用的python代码导入外部文件,这些导入失败了,因为"没有命名的模块"。如果我直接从python运行脚本,那么一切都会按预期进行。
因此,我的问题是,在通过C++绑定运行的python脚本中导入模块的正确方式是什么?
C++代码:
#include "boost/python.hpp"
int main(int argc, char** argv)
{
try
{
Py_Initialize();
boost::python::object test = boost::python::import("__main__");
boost::python::object testDict = test.attr("__dict__");
boost::python::exec_file("test.py", testDict, testDict);
}
catch(boost::python::error_already_set& e)
{
PyErr_Print();
}
return 0;
}
Python代码:
import ModuleX
因此,我的问题是在C++中初始化时模块搜索路径设置不正确的简单情况。
来自Python文档介绍:
在大多数系统上(特别是在Unix和Windows上,尽管细节略有不同),Py_Initize()计算模块基于对标准位置的最佳猜测的搜索路径Python解释器可执行文件,假设Python库在相对于Python解释器的固定位置中找到可执行文件。特别是,它查找名为lib/pythonX.Y相对于可执行文件所在的父目录在shell命令搜索路径(环境变量PATH)。
因此,这意味着模块搜索路径不会设置为指向当前工作目录,而是指向系统python安装文件夹。
对我来说,解决方案是正确地将模块搜索路径设置为指向当前工作目录。为此,您需要初始化python,然后提取sys.path值并添加任何其他路径。如果你不喜欢,请原谅使用助推;您应该能够很容易地看到如何替换所需的任何字符串。
Py_Initialize();
// now time to insert the current working directory into the python path so module search can take advantage
// this must happen after python has been initialised
boost::filesystem::path workingDir = boost::filesystem::absolute("./").normalize();
PyObject* sysPath = PySys_GetObject("path");
PyList_Insert( sysPath, 0, PyString_FromString(workingDir.string().c_str()));
我知道这已经很老了,已经有了一个可靠的答案,但我用一个简单的也能得到同样的效果
exec("import sys nsys.path.append('.')");
如果我错了,请纠正我。
相关文章:
- Python 3.8 不能与 Pybind11 一起导入 [Windows]
- 在 python 模块中导入子模块时PyImport_Import失败
- 在从Qt调用的Python脚本中导入OpenCV崩溃
- 编译boost_python扩展无法在 python 2.7 中导入
- Python 3.8:运行外部C++代码:无法导入模块
- C++ #include<XXX.h>相当于 Python 导入的 XXX 作为 X
- 如何将 Cython 生成的模块从 python 导入到 C/C++ 主文件?(C/C++编程)
- Python - 导入 c++ 模块接口 - 无法打开共享对象文件
- 提升 Python 导入失败,未定义包装类的符号
- 如何处理python导入模块中c++断言导致的Celery WorkerLostError
- Boost Python :导入模块时遇到问题
- 从 boost python 导入依赖的 python 库
- 无法使用boost.python导入模块
- 从自定义构建的Python导入自定义模块失败
- Boost Python导入一个带有std::vectors作为参数的c++函数
- c++ Python导入类;调用方法
- 由python导入的python错误
- Python 3.x - 导入密码化 C++ 代码时未定义的符号
- MAC雪豹端口上的Boost python导入错误
- 从您无法控制且无权访问的线程中释放 Python 导入锁