python和swig集成

2024-06-26 10:48:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个班,第一个叫“萝卜”,第二个叫“萝卜”。 所有代码都是用C++编写的,需要在Python中使用。在

Radish已经使用SWIG暴露于python;相反,radishont已经使用boost::python公开了。在

我需要将一个方法添加到具有以下语法的radishont类中:

Radish* get_radish()
{
    return &radish;
}

其中“radish”是包含在radishont中的一个萝卜实例。在

当我执行python代码时,我收到以下异常:

^{pr2}$

所以,我的问题是:如何在不使用SWIG重写radishont的情况下使这个方法在python中工作?在


Tags: 实例方法代码getreturn语法情况swig
3条回答

我很确定你最好重写SWIG接口来包含新函数。SWIG使用与boost::pythons系统不兼容的类/函数的内部注册系统(或者至少不是现成的)。在

这个错误来自Boost.Python. BP的type表中没有Radish的条目。如果没有进入,英国石油公司就没有办法知道该怎么做。唯一的办法就是用BP包萝卜。在

恐怕BP和SWIG根本就不是为了合作而生的,而且非常怀疑你是否能让他们按照你想要的方式工作,而不是大规模的黑客攻击。在

我建议您将整个系统移到一个库或另一个库

最后,我做到了。在

我在boost python模块中创建了一个类实例,如下所示:

class_<Radish>("Radish");

我创建了这样一个转换器函数:

^{pr2}$

其中PySwigObject是这样的结构:

struct PySwigObject 
{
    PyObject_HEAD 
    void * ptr;
    const char * desc;
};

最后,我注册了我的转换器:

boost::python::converter::registry::insert(&radishConvert, type_id<Radish>());

这非常有效,我可以从SWIG获取对象并将其传递给boost::python。逆过程还没有解决,但对我来说已经足够了。在

这是我用来寻找解决方案的指南: http://wiki.python.org/moin/boost.python/HowTo#SWIG_exposed_C.2B-.2B-_object_from_Python

相关问题 更多 >