繁体   English   中英

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

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

我是boost.python的新手。 我回顾了很多有关将boost.python与python一起使用的建议,但是仍然不容易理解并为我找到解决方案。

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

示例文件:Main.cpp MyPythonClass.py

假设如果“ MyPythonClass.py”中具有“ bark()”函数的“ Dog”类,如何在cpp中获取回调并发送参数?

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

当需要从C ++调用Python且C ++拥有main函数时,则必须 Python中断器嵌入 C ++程序中。 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();

通常,Boost.Python API提供了一种以Python风格编写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函数。 非常类似于Perl xs模块。

如果在main.cpp中有一个说bark()的函数,则可以使用boost python将此main.cpp转换为python可调用模块。

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

import main
main.bark()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM