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

How to import a function from python file by Boost.Python

我对 boost.python 完全陌生。 看了很多推荐用boost.python申请python,但是还是不太好理解,找到适合我的解决方案。

我想要的是直接从 python "SourceFile"

导入函数或 class

示例文件: Main.cpp MyPythonClass.py

假设在"MyPythonClass.py"中有一个"Dog"class和"bark()"函数,我如何在cpp中获取回调和发送参数?

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

Boost python 用于从 python 源调用 cplusplus 函数。与 Perl xs 模块非常相似。

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

然后从 python 脚本(假设 link 输出文件是 main.so):

import main
main.bark()

当需要从 C++ 调用 Python,并且 C++ 拥有 main 函数时,则必须 在 C++ 程序中嵌入 Python 中断器. Boost.Python API 并不是 Python/C API 的完整包装器,因此可能会发现需要直接调用 Python/C [=52= 的一部分].然而,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 via 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