(在 Boost::Python 中)如何实例化 python 模块中定义的类的对象并从 C++ 调用其方法

发布于 2024-10-20 04:09:58 字数 687 浏览 1 评论 0原文

假设我在 python 模块中定义了一个类:

class A(object):
    def __init__(self):
        print 'init'
    def method(self):
        print 'method'

我想用 boost::python 实例化该类的一个对象。我尝试了以下方法:

namespace py = boost::python;

// importing the module and extracting its namespace to
// the variable `ns`
...

py::object a = py::exec("A()", ns)
a.attr("method")()

打印 init 然后崩溃。我观察到,在执行

py::object a = py::exec("A()", ns)

打印 a 的字符串表示

std::cout << std::string(py::extract<std::string>(py::str(a))) << std::endl;

后,打印 None 。所以出了问题。我该如何正确地做到这一点?

Assume I have a class defined in a python module:

class A(object):
    def __init__(self):
        print 'init'
    def method(self):
        print 'method'

I'd like to instantiate an object of that class with boost::python. I tried it the following way:

namespace py = boost::python;

// importing the module and extracting its namespace to
// the variable `ns`
...

py::object a = py::exec("A()", ns)
a.attr("method")()

which prints init and then crashes. I observed that after executing

py::object a = py::exec("A()", ns)

printing the string representation of a with

std::cout << std::string(py::extract<std::string>(py::str(a))) << std::endl;

prints None. So something went wrong. How do I do this right?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

红颜悴 2024-10-27 04:09:58

我自己找到了答案:使用 eval 而不是 exec。

I found the answer myself: use eval instead of exec.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文