我对boost.python完全不熟悉。 我回顾了很多推荐使用boost.python来应用python,但是仍然不容易理解并为我找到解决方案。
我想要的是直接从python导入一个函数或类" SourceFile"
示例文件: Main.cpp的 MyPythonClass.py
如果有一个" Dog" class in" MyPythonClass.py"用" bark()"函数,如何在cpp中获得回调和发送参数?
我不知道该怎么做! 请帮帮我!
答案 0 :(得分:5)
当需要从C ++调用Python,并且C ++拥有main函数时,必须在C ++程序中嵌入 Python中断。 Boost.Python API不是Python / C API的完整包装器,因此可能会发现需要直接调用部分Python / C API。尽管如此,Boost.Python的API可以使互操作性更容易。考虑阅读官方Boost.Python embedding tutorial以获取更多信息。
这是嵌入Python的C ++程序的基本框架:
int main()
{
// Initialize Python.
Py_Initialize();
namespace python = boost::python;
try
{
... Boost.Python calls ...
}
catch (const python::error_already_set&)
{
PyErr_Print();
return 1;
}
// Do not call Py_Finalize() with Boost.Python.
}
嵌入Python时,可能需要通过module search path扩充PYTHONPATH
,以便可以从自定义位置导入模块。
// Allow Python to load modules from the current directory.
setenv("PYTHONPATH", ".", 1);
// Initialize Python.
Py_Initialize();
通常,Boost.Python API提供了一种以Python-ish方式编写C ++代码的方法。以下示例demonstrates在C ++中嵌入Python解释器,并使C ++从磁盘导入MyPythonClass
Python模块,实例化MyPythonClass.Dog
的实例,然后在其上调用bark()
Dog
实例:
#include <boost/python.hpp>
#include <cstdlib> // setenv
int main()
{
// Allow Python to load modules from the current directory.
setenv("PYTHONPATH", ".", 1);
// Initialize Python.
Py_Initialize();
namespace python = boost::python;
try
{
// >>> import MyPythonClass
python::object my_python_class_module = python::import("MyPythonClass");
// >>> dog = MyPythonClass.Dog()
python::object dog = my_python_class_module.attr("Dog")();
// >>> dog.bark("woof");
dog.attr("bark")("woof");
}
catch (const python::error_already_set&)
{
PyErr_Print();
return 1;
}
// Do not call Py_Finalize() with Boost.Python.
}
给定MyPythonClass
模块包含:
class Dog():
def bark(self, message):
print "The dog barks: {}".format(message)
上述程序输出:
The dog barks: woof
答案 1 :(得分:-1)
Boost python用于从python源调用cplusplus函数。非常像Perl xs模块。
如果你在main.cpp中有一个函数say bark(),你可以使用boost python将这个main.cpp转换为python可调用模块。
然后从python脚本(假设链接输出文件是main.so):
import main
main.bark()