我对boost.python完全陌生。 我回顾了很多推荐使用boost.python来应用python,但仍然不容易理解并为我找到解决方案。如何通过Boost.Python从python文件导入函数
我要的是导入一个函数或类是直接从蟒蛇“的SourceFile”
示例文件: Main.cpp的 MyPythonClass.py
让我们是否有一个“狗”说“MyPythonClass.py”中带有“bark()”函数的类,我如何获得回调并在cpp中发送参数?
我不知道该怎么办! 请帮帮我!
我对boost.python完全陌生。 我回顾了很多推荐使用boost.python来应用python,但仍然不容易理解并为我找到解决方案。如何通过Boost.Python从python文件导入函数
我要的是导入一个函数或类是直接从蟒蛇“的SourceFile”
示例文件: Main.cpp的 MyPythonClass.py
让我们是否有一个“狗”说“MyPythonClass.py”中带有“bark()”函数的类,我如何获得回调并在cpp中发送参数?
我不知道该怎么办! 请帮帮我!
当一个需要调用选自C的Python ++和C++拥有的主要功能,然后就必须嵌入 Python的C++程序中的中断程序。 Boost.Python API不是Python/C API的完整包装,因此可能会发现需要直接调用Python/C API的一部分。不过,Boost.Python的API可以使互操作性更容易。考虑阅读官方的Boost.Python embedding tutorial了解更多信息。
这里是C++程序嵌入的Python基本骨架:
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
一个实例,然后在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()
对不起,我想也许有一些误解。我必须在C++环境中工作,所以我想我的C++程序直接使用Dog.bark()从python ....不在python –
Boost python不帮你在那里。 boost是一个C++模块。试试这个https://docs.python.org/3/extending/embedding.html – kbang
非常感谢你。加工!!! –
不应该在最后调用'Py_Finalize();'? –
@TrevorHickey,no。如[Boost.Python嵌入文档](http://www.boost.org/doc/libs/1_65_1/libs/python/doc/html/tutorial/tutorial/embedding.html)中所述,'Py_Finalize()'不应该被叫停止翻译。 –