[英]How to import a function from python file by Boost.Python
我是boost.python的新手。 我回顾了很多有关将boost.python与python一起使用的建议,但是仍然不容易理解并为我找到解决方案。
我想要的是直接从python“ SourceFile”导入函数或类
示例文件:Main.cpp MyPythonClass.py
假设如果“ MyPythonClass.py”中具有“ bark()”函数的“ Dog”类,如何在cpp中获取回调并发送参数?
我不知道该怎么办! 请帮我!
当需要从C ++调用Python且C ++拥有main函数时,则必须将 Python中断器嵌入 C ++程序中。 Boost.Python API并不是Python / C API的完整包装,因此人们可能会发现需要直接调用Python / C API的某些部分。 尽管如此,Boost.Python的API可以使互操作性变得更容易。 考虑阅读官方的Boost.Python 嵌入教程以获取更多信息。
这是嵌入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时,可能有必要通过PYTHONPATH
扩展模块搜索路径 ,以便可以从自定义位置导入模块。
// Allow Python to load modules from the current directory.
setenv("PYTHONPATH", ".", 1);
// Initialize Python.
Py_Initialize();
通常,Boost.Python API提供了一种以Python风格编写C ++代码的方法。 以下示例演示了在C ++中嵌入Python解释器,并让C ++从磁盘导入MyPythonClass
Python模块,实例化MyPythonClass.Dog
的实例,然后在Dog
实例上调用bark()
:
#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
Boost python用于从python源调用cplusplus函数。 非常类似于Perl xs模块。
如果在main.cpp中有一个说bark()的函数,则可以使用boost python将此main.cpp转换为python可调用模块。
然后从python脚本(假设链接输出文件是main.so):
import main
main.bark()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.