Tag: swig

SWIG与python和C:参数

我有这个function: void func(int* a, int b); 我希望在python中提供这样的内容: func(list, int) 即,用户传递一个列表和一个整数(告诉函数应该在列表中存储多少条目)。 为此,我需要在“a”的初始化中知道“b”的值(因为我需要临时的原始C int数组)。 %typemap(in) ( int* a) { //need to allocate sizeof(int) * b bytes temporarily } 但我不知道“b”的值,因为它只是稍后解析! 如何访问“b”参数的值?

在Python SWIG中包装void *参数

我用Python SWIG包装这个lib,它有一个如下所示的函数: int set_option(Foo *foo, const char *name, void *value); 在lib const char *name中映射到我有权查询的类型: int , char * , char ** 。 默认生成的包装器代码只接受包装的void * (自然)。 使包装方法接受任何 Python对象作为参数的最佳方法是什么,并在我自己的C代码中进行类型检查和Python到C转换? 我的猜测是某种类型的地图,但唉,我无法弄清楚。 @Goodies In [12]: lib.set_option(foo, “option”, “value”) ————————————————————————— TypeError Traceback (most recent call last) in () —-> 1 lib.set_option(foo, “option”, “value”) TypeError: in method ‘set_option’, argument 3 of […]

Swig和多维数组

我正在使用Swig将Cthon与C代码连接起来。 我想调用一个C函数,它接受一个包含int ** var的struct的参数: typedef struct { (…) int** my2Darray; } myStruct; void myCFunction( myStruct struct ); 我正在努力研究多维数组。 我的代码如下所示: 在接口文件中,我使用carray像这样: %include carrays.i %array_class( int, intArray ); %array_class( intArray, intArrayArray ); 在python中,我有: myStruct = myModule.myStruct() var = myModule.intArrayArray(28) for j in range(28): var1 = myModule.intArray(28) for i in range(28): var1[i] = (…) filling var1 (…) var[j] […]

Swig – 生成包装器以传递struct数组

更新 我刚刚发现了%apply指令(例如见这里 )。 不幸的是我无法使用结构: %module packer_cs %include “carrays.i” %{ #include “packer.h” %} %include “typemaps.i” %include “arrays_csharp.i” %apply image_t INPUT[] { image_t *images } %include “packer.h” 这导致: swig -csharp -outdir bin\csharp packer\packer.i Warning 453: Can’t apply (image_t INPUT[]). No typemaps are defined. 我找不到任何有关此警告的文档。 看起来我必须定义一个自定义类型映射,但我不知道从哪里开始。 我已经厌倦了这种缺乏文档,并且非常渴望有一天能够成功编写我的包装器:( 原帖 在我之前的 两篇post之后,我仍然在使用C#中的C库时遇到问题。 回顾一下:我有一个C库,我正在尝试使用Swig编写一个C#包装器。 在.h文件中,方法声明为: int pack(image_t *images, int nb_images, parameters_t […]

运行SWIG绑定的Python + C程序在另一台计算机上运行时会出现DLL错误

所以我编写了一个小的测试程序,它使用SWIG作为python和C之间的桥梁。程序的主要部分是python文件。 事情在我自己的电脑上运行良好,但是一旦我将它转移到另一个,它会立即抛出“ImportError:DLL加载失败:找不到指定的模块。” 错误。 我试图通过将它移动到我自己的电脑上的另一个目录来查看是否可以是静态编码的文件位置,这仍然可以正常工作。 接下来我在SWIG python包装器中做了一些调试,找出了它加载的DLL; 其文件路径也是正确的。 我的其他PC也有正确的路径。 有谁知道我可能忘记了导致此错误的事情?

使用Swig的JNI for C和函数指针回调的麻烦

我们在java中加载的一个库中有一个C函数,它接受一个函数指针 function定义如下 typedef char int8 typedef unsigned short uint16 uint32 poll_broadcasts(void *(pfn)(int8*,uint16)); 在C中,它如下使用 void handle_broadcasts( int8 *broadcast, uint16 length ) uint32 a = poll_broadcasts( (void*(*)(int8*,uint16)) handle_broadcasts ) 但是当您使用Swig生成JNI包装器时,它会为poll_broadcast创建以下定义 public static long poll_broadcasts(SWIGTYPE_p_f_p_char_unsigned_short__p_void pfn) { return TestJNI.poll_broadcasts(SWIGTYPE_p_f_p_char_unsigned_short__p_void.getCPtr(pfn)); } 按照答案 我应该如何编写.i文件来包装Java或C#中的回调 试过下面 test.h void * data; typedef void* (*callback_handle_broadcast_t)(int8*, uint16); static callback_handle_broadcast_t handle_broadcast; static void set_handle_broadcast(callback_handle_broadcast_t cb, […]

SWIG – 将C字符串数组包装到python列表

我想知道使用SWIG将C中的字符串数组包装到Python列表的正确方法是什么。 数组在struct中: typedef struct { char** my_array; char* some_string; }Foo; SWIG自动将some_string包装到python字符串。 我应该把什么放在SWIG接口文件中,以便我可以在Python中访问my_array作为常规Python字符串列表[‘string1’,’string2’]? 我使用了typemap作为sugested: %typemap(python,out) char** { int len,i; len = 0; while ($1[len]) len++; $result = PyList_New(len); for (i = 0; i < len; i++) { PyList_SetItem($result,i,PyString_FromString($1[i])); } } 但那仍然行不通。 在Python中,my_array变量显示为SwigPyObject:_20afba0100000000_p_p_char。 我想知道是不是因为char **在一个结构中? 也许我需要告知SWIG那个? 有任何想法吗?

python的swig typemap:输入和输出数组

我有一个我想在Python中使用的C函数: extern int convertAtoB( stateStruct *myStruct, const double PointA[3], double PointB[3]); 使用SWIG,我想我需要定义一个类型映射来转换两个点(PointA是输入,PointB是输出),以便Python可以使用它。 在typemaps.i中似乎没有与此一起使用的类型映射,因此我必须定义一个。 我似乎无法在SWIG文档中找到数组的示例。 我想像这样使用这个库: s = externalStruct() point_a = [1, 2, 3] result, point_b = convertAtoB(s, point_a) print point_b “expect [4, 5, 6]” 我该怎么办? 谢谢

使用swig和Anaconda Python找不到Python.h

我正在尝试按照本教程编译一个简单的python / C示例: http://www.swig.org/tutorial.html 我在MacOS上使用Anaconda python。 但是,当我跑 gcc -c example.c example_wrap.c -I/Users/myuser/anaconda/include/ 我明白了: example_wrap.c:130:11: fatal error: ‘Python.h’ file not found # include ^ 似乎在一些问题中报告了这个问题: 尝试编译C扩展模块时缺少Python.h. 缺少Python.h,无法找到 Python.h:没有这样的文件或目录 但似乎没有人提供特定于MacOS上的Anaconda的答案 有谁解决了这个?

函数类型“extern __declspec(dllimport)INT __cdecl”在C / C ++或SWIG中是否有意义?

我试图通过SWIG使用其头文件包装DLL。 使用SWIG处理我的接口.i文件时出现语法错误。 在追踪违规行(SWIG错误消息打印的行号与真正的违规行不匹配)之后,我发现最小的不可处理的SWIG接口文件是: /* example.i */ %module example %{ extern __declspec(dllimport) INT __cdecl function(int argument); %} extern __declspec(dllimport) INT __cdecl function(int argument); 原型tern extern __declspec(dllimport) INT __cdecl function(int argument); 是从我试图包装的头文件中获取的。 这种类型声明了数十个函数。 正如你所看到的,我没有足够的C经验来判断这种类型是否有意义。 头文件来自供应商,使用Visual C ++ 6编译好。有人可以澄清一下吗?