如何通过Boost.Python从python文件导入函数

时间:2016-07-27 18:01:09

标签: python c++ boost-python

我对boost.python完全不熟悉。 我回顾了很多推荐使用boost.python来应用python,但是仍然不容易理解并为我找到解决方案。

我想要的是直接从python导入一个函数或类" SourceFile"

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

如果有一个" Dog" class in" MyPythonClass.py"用" bark()"函数,如何在cpp中获得回调和发送参数?

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

2 个答案:

答案 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()