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

标签 python c++ boost-python

我是 boost.python 的新手。 看了很多推荐使用 boost.python 来应用 python 的,但是还是不太容易理解和找到适合我的解决方案。

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

示例文件: main.cpp 我的Python类.py

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

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

最佳答案

当需要从 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 的方式编写 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

关于python - 如何通过 Boost.Python 从 python 文件导入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38620134/

相关文章:

python - 成对查找字符串中的所有括号 - Python 3

python - python 中的正则表达式跳过行的前 2 个字符

c++ - std::auto_ptr 或 boost::shared_ptr 用于 pImpl 成语?

c++ - Boost::python 使用和返回模板公开 C++ 函数

c++ - 如何重新初始化嵌入式 Python 解释器?

Python,jsonpath_ng : Exception: Parse error at 1:4 near token ?(?)

Python 返回列表列表以查看值是否存在

c++ - boost asio 计时器不适用于阻塞读取调用

c++ - 如何有效地从 std::deque 创建 D3D 缓冲区

c++ - 无论如何在标题中使用 boost python 包装器?