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

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

本文关键字:导入 函数 蟒蛇 文件 python 何通过 Boost      更新时间:2023-10-16

我对boost.python完全陌生。我复习了很多关于使用boost.python应用python的建议,但仍然不容易理解并为我找到解决方案。

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

示例文件:主要.cppMyPythonClass.py

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

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

当需要从C++调用Python,并且C++拥有主函数时,必须在C++程序中嵌入Python中断器。The Boost。Python API不是Python/C API的完整包装器,因此可能会发现需要直接调用Python/C API的部分。尽管如此,Boost。Python的API可以简化互操作性。考虑阅读官方的Boost。Python嵌入教程了解更多信息。


以下是嵌入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时,可能需要通过PYTHONPATH增加模块搜索路径,以便可以从自定义位置导入模块。

// Allow Python to load modules from the current directory.
setenv("PYTHONPATH", ".", 1);
// Initialize Python.
Py_Initialize();

通常情况下,助推。Python API提供了一种以Python-ish方式编写C++代码的方法。以下示例演示了在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函数。很像Perlxs模块。

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

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

import main
main.bark()