gpt4 book ai didi

c++ - 使用C++指针调用python函数

转载 作者:行者123 更新时间:2023-12-01 14:52:18 25 4
gpt4 key购买 nike

我想将可调用对象从Python传递到C++,然后使用已为其注册base_的参数从C++调用它。例:

namespace bpy = boost::python;

bpy::class_<X, X*, boost::noncopyable>("X", bpy::no_init);

bpy::def("f", +[](bpy::object fn) {
fn(new X());
});

然后从python:

from example import f

def fn(x):
print "x.g() =", x.g()

f(fn)

抛出:

TypeError: No to_python (by-value) converter found for C++ type: X



我对使用其他类型的参数(例如 intfloat或我已注册的其他类型的参数)可调用没有任何问题,但是此操作失败了,我不明白为什么:为什么我需要进行按值转换传递 X*,我指定 X的保留类型为 X*

关于如何解决此问题的任何建议?

有关Coliru的完整示例: http://coliru.stacked-crooked.com/a/b3492d2e846d705c

最佳答案

根据Argument Handling in Calling Python Functions and Methods:

Arguments are converted to Python according to their type. By default, the arguments a1...aN are copied into new Python objects, but this behavior can be overridden by the use of ptr() and ref():

class X : boost::noncopyable { ... };

void apply(PyObject* callable, X& x) { // Invoke callable, passing a Python object which holds a reference to x
boost::python::call(callable, boost::ref(x)); }



似乎即使指定了指针类型,实现也采用了基本的非指针类型。但是在这种情况下,无论如何可以使用 boost::refbpy::ptr来解决问题。

更改:
bpy::def("f", +[](bpy::object fn) {
fn(new X());
});

变成:
bpy::def("f", +[](bpy::object fn) {
return fn(bpy::ptr(new X()));
});

现在它可以工作了:
$ python test.py 
x.g() = 0

关于c++ - 使用C++指针调用python函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62395621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com