2016-07-27 95 views
3

我对boost.python完全陌生。 我回顾了很多推荐使用boost.python来应用python,但仍然不容易理解并为我找到解决方案。如何通过Boost.Python从python文件导入函数

我要的是导入一个函数或类是直接从蟒蛇“的SourceFile”

示例文件: Main.cpp的 MyPythonClass.py

让我们是否有一个“狗”说“MyPythonClass.py”中带有“bark()”函数的类,我如何获得回调并在cpp中发送参数?

我不知道该怎么办! 请帮帮我!

回答

5

当一个需要调用选自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 
+0

非常感谢你。加工!!! –

+0

不应该在最后调用'Py_Finalize();'? –

+0

@TrevorHickey,no。如[Boost.Python嵌入文档](http://www.boost.org/doc/libs/1_65_1/libs/python/doc/html/tutorial/tutorial/embedding.html)中所述,'Py_Finalize()'不应该被叫停止翻译。 –

0

Boost python用于从python源代码调用cplusplus函数。非常像Perl xs模块。

如果你在main.cpp中有一个函数叫bark(),你可以使用boost python将这个main.cpp转换成一个python可调用模块。

从Python脚本

然后(假设链路输出文件main.so):

import main 
main.bark() 
+0

对不起,我想也许有一些误解。我必须在C++环境中工作,所以我想我的C++程序直接使用Dog.bark()从python ....不在python –

+0

Boost python不帮你在那里。 boost是一个C++模块。试试这个https://docs.python.org/3/extending/embedding.html – kbang

相关问题