暴露c++函数,使用Boost.Python返回指针
Exposing C++ functions, that return pointer using Boost.Python
我想使用Boost将以下c++函数公开给Python。Python:
int* test1() {
return new int(42);
}
// Now exposing the function with Boost.Python
BOOST_PYTHON_MODULE(libtest1)
{
using namespace boost::python;
def("test1", test1);
}
当我尝试编译这个库时,由于(这是我的猜测)Boost而发生错误。Python不知道如何将int*转换为PyObject。
我认为需要做的是定义转换结构,像这样:
template<class T>
struct int_ptr_to_python
{
static PyObject* convert(int* i_ptr)
{
return i_ptr;
}
};
并将其传递给BOOST_PYTHON_MODULE声明:
BOOST_PYTHON_MODULE(libtest1)
{
using namespace boost::python;
def("test1", test1);
to_python_converter<int*, int_ptr_to_python<int*> >();
}
但它也不起作用。我找不到任何关于函数的信息,返回指针应该如何处理。
有人能帮忙吗?
简而言之,不能直接使用Boost公开返回int*
的函数。因为Python中没有有意义的对应类型,因为给定的整数是不可变的。
- 如果目标是向Python返回一个数字,那么按值返回
int
。这可能需要使用辅助函数来适应遗留api。 - 如果目标是返回一个指向用new-expression分配的对象的指针,那么该对象必须是一个类或联合,并且该函数必须用特定的策略公开,以指示所有权责任。
与其立即给出最终的解决方案,我更愿意花点时间逐步介绍编译器错误。与提升。Python有时使用c++ 11之前版本的静态断言在编译器消息中提供指令。不幸的是,要在大量的模板中找到它们有点困难。
以下代码:
#include <boost/python.hpp>
int* make_int() { return new int(42); }
BOOST_PYTHON_MODULE(example)
{
namespace python = boost::python;
python::def("make_int", &make_int);
}
在clang中产生以下相关输出,其中重要的细节以粗体突出显示:
<>之前…/提高/python/细节/caller.hpp: 102:98:错误:boost::python::detail::中没有名为'get_pytype'的成员 specify_a_return_value_policy_to_wrap_functions_returning '…create_result_converter((PyObject*)0, (ResultConverter *)0,(ResultConverter *) 0) .g……之前提振。Python告诉我们需要为返回int*
的函数指定一个boost::python::return_value_policy
。ResultConverterGenerators有多种型号。通常,策略用于控制返回对象的所有权或生命周期语义。由于原始代码中的函数直接返回一个指向Python的新指针,如果期望调用方负责删除对象,则boost::python::manage_new_object
是合适的。
指定对象管理策略仍然失败:
#include <boost/python.hpp>
int* make_int() { return new int(42); }
BOOST_PYTHON_MODULE(example)
{
namespace python = boost::python;
python::def("make_int", &make_int,
python::return_value_policy<python::manage_new_object>());
}
产生以下相关输出:
<>之前…/提高/python/对象/make_instance.hpp: 27:9:错误:调用assertion_failed没有匹配的函数 BOOST_MPL_ASSERT (mpl:: or_<is_class<>, is_union在本例中,是Boost。Python告诉我们,从具有managed_new_object
ResultConverterGenerator的函数返回的对象必须是class
或union
。对于int*
,最合适的解决方案是在传递Boost时按值返回int
。Python层。但是,为了完整起见,下面演示:
- 使用辅助函数来适应遗留API
- 如何限制使用返回指针的工厂函数创建用户定义类型。
#include <boost/python.hpp>
/// Legacy API.
int* make_int() { return new int(42); }
/// Auxiliary function that adapts the legacy API to Python.
int py_make_int()
{
std::auto_ptr<int> ptr(make_int());
return *ptr;
}
/// Auxiliary class that adapts the legacy API to Python.
class holder
: private boost::noncopyable
{
public:
holder()
: value_(make_int())
{}
int get_value() const { return *value_; }
void set_value(int value) { *value_ = value; }
private:
std::auto_ptr<int> value_;
};
/// Factory function for the holder class.
holder* make_holder()
{
return new holder();
}
BOOST_PYTHON_MODULE(example)
{
namespace python = boost::python;
python::def("make_int", &py_make_int);
python::class_<holder, boost::noncopyable>("Holder", python::no_init)
.add_property("value",
python::make_function(&holder::get_value),
python::make_function(&holder::set_value))
;
python::def("make_holder", &make_holder,
python::return_value_policy<python::manage_new_object>());
}
互动用法:>>> import example
>>> assert(42 == example.make_int())
>>> holder = example.Holder()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: This class cannot be instantiated from Python
>>> holder = example.make_holder()
>>> assert(42 == holder.value)
>>> holder.value *= 2
>>> assert(84 == holder.value)
- 从python中调用C++函数并获取返回值
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- C++返回 Numpy 数组的 Python 扩展模块
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- 使用 Main() 返回值作为 python 脚本的参数
- std::endl,在 Python 中是否有等价物?(返回 + 刷新)
- C++ python 中的函数返回数字而不是字符串
- Boost.Python 返回引用现有 c++ 对象的 python 对象
- 使用BOOST :: PYTHON返回裸露的类对象列表,这些对象是不可复制的
- 如何在 C 中获取 python 返回值?
- 从c++向python返回复杂列表的元组
- Python返回一个不可编译对象的列表
- boost python返回与makeconstructor相同的实例
- 如何将数组从c++传递给python函数,并将python返回的数组检索到c++
- 使用boost python返回narray的字典会导致内存泄漏
- 暴露c++函数,使用Boost.Python返回指针
- 无法从嵌入式Python返回长整数到c++
- 如何调用从Python返回双精度向量的c++函数
- 从python返回一个数组到c++