使用 C++ 指针调用 python 函数
Call python function with C++ pointers
我想将可调用对象从 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
我对 callable 采用其他类型的参数没有问题,例如 int
、float
或我注册的其他一些类型,但是这个失败了,我不明白为什么: 当我传递 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::ref
或 bpy::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
我想将可调用对象从 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
我对 callable 采用其他类型的参数没有问题,例如 int
、float
或我注册的其他一些类型,但是这个失败了,我不明白为什么: 当我传递 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::ref
或 bpy::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