Tag: Swig

将C ++ API公开给Python

我目前正在做一个项目,我不得不用Python来包装C ++类,以便能够编写脚本。 所以我的具体经验也涉及在我们的程序中embeddedPython解释器。 我试过的select是: Boost.Python的 我喜欢Boost.Python生成的清洁API,但事实上,它会要求用户安装额外的依赖关系,使我们切换到SWIG。 痛饮 SWIG对我们的主要优势是它不需要最终用户安装它来使用最终的程序。 你曾经做过什么,你有什么经验呢?

Python:SWIG vs ctypes

在Python中,在什么情况下SWIG比ctypes更好的select共享库中的入口点? 假设您还没有SWIG接口文件。 这两个性能指标是什么?

扩展python – swig,而不是swig或Cython

我发现我的Python代码中的瓶颈,与心理等玩过。然后决定编写ac / c + +扩展的性能。 在swig的帮助下,你几乎不需要关心参数等。一切正常。 现在我的问题:在调用实际的.pyd或.so代码之前,swig会创build一个相当大的py文件,它会执行大量的“检查”和“PySwigObject”。 如果你手写这个文件,或者让swig去做,你们中的任何人是否有任何经验是否有更多的性能获得?

有没有办法使用pythonappend与SWIG的新的内置function?

我有一个与SWIG合作的小项目。 特别是,我的一些函数返回std::vector s,它被转换成Python中的元组。 现在,我做了很多数字,所以我只是让SWIG在从c ++代码返回之后将它们转换为numpy数组。 要做到这一点,我在SWIG中使用类似下面的内容。 %feature("pythonappend") My::Cool::Namespace::Data() const %{ if isinstance(val, tuple) : val = numpy.array(val) %} (实际上,有几个函数名为Data,其中一些返回浮点数,这就是为什么我检查val实际上是一个元组)。 但是,我也想使用现在可用的-builtin标志。 对这些数据函数的调用是很less见的,而且大部分是交互式的,所以它们的慢度不是问题,但是还有其他的慢速循环会随着内置选项而显着加速。 问题是,当我使用该标志时,pythonappendfunction被忽略。 现在,Data只是再次返回一个元组。 有什么办法,我仍然可以返回numpy数组? 我尝试使用types映射,但它变成了一个巨大的混乱。 编辑: Borealid非常好地回答了这个问题。 只是为了完整性,我包含了一些相关的,但我需要的,因为我通过const引用返回,并使用vector向量(不要开始!),因此我需要微妙的不同的types映射。 这些是不同的,我不希望其他任何人试图找出微小的差异。 %typemap(out) std::vector<int>& { npy_intp result_size = $1->size(); npy_intp dims[1] = { result_size }; PyArrayObject* npy_arr = (PyArrayObject*)PyArray_SimpleNew(1, dims, NPY_INT); int* dat = (int*) PyArray_DATA(npy_arr); for (size_t […]

如何编写.i文件以在Java或C#中包装callback

我的C程序使用定期调用的callback函数。 我希望能够处理Java或C#程序中的callback函数。 我应该如何编写.i文件来实现这一目标? Ccallback看起来如此: static void on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id, pjsip_rx_data *rdata)

我怎样才能在Python中实现一个C ++类,被C ++调用?

我有一个用C ++编写的类接口。 我有几个类来实现这个接口也用C ++编写。 这些被称为在一个更大的C + +程序的背景下,实质上实现“主”。 我希望能够用Python编写这个接口的实现,并允许它们在更大的C ++程序的上下文中使用,就像它们刚刚用C ++编写的一样。 关于python和c ++的接口已经有很多了,但是我不太清楚如何去做我想要的。 我可以find最近的是这里: http : //www.cs.brown.edu/~jwicks/boost/libs/python/doc/tutorial/doc/html/python/exposing.html#python.class_virtual_functions ,但这是不不太对。 更具体一点,假设我有一个现有的C ++接口定义如下: // myif.h class myif { public: virtual float myfunc(float a); }; 我想要做的是这样的: // mycl.py … some magic python stuff … class MyCl(myif): def myfunc(a): return a*2 然后,回到我的C ++代码中,我想能够像这样说: // mymain.cc void main(…) { … some magic […]