当前位置: 首页 > 面试题库 >

Python / SWIG:输出数组

裘光启
2023-03-14
问题内容

我试图从使用SWIG for Python包装的C函数输出值数组。我正在尝试使用以下类型映射。

代码

int oldmain() {
float *output = {0,1};
return output;
}

类型图:

%typemap(out) float* { 
   int i; 
  $result = PyList_New($1_dim0); 
   for (i = 0; i < $1_dim0; i++) { 
 PyObject *o = PyFloat_FromDouble((double) $1[i]); 
 PyList_SetItem($result,i,o); 
 } 
}

我的代码可以很好地编译,但是当我运行该函数时,它挂起了(没有更多调试方法)。

关于我要去哪里的任何建议?

谢谢。


问题答案:

这应该可以帮助您:

/* example.c */

float * oldmain() {
    static float output[] = {0.,1.};
    return output;
}

您将在此处返回一个指针,而swig不知道它的大小。普通的$ 1_dim0不起作用,因此您必须进行硬编码或做其他魔术。像这样:

/* example.i */
%module example
%{
 /* Put header files here or function declarations like below */
  extern float * oldmain();
%}

%typemap(out) float* oldmain {
  int i;
  //$1, $1_dim0, $1_dim1
  $result = PyList_New(2);
  for (i = 0; i < 2; i++) {
    PyObject *o = PyFloat_FromDouble((double) $1[i]);
    PyList_SetItem($result,i,o);
  }
}

%include "example.c"

然后在python中,您应该获得:

>> import example
>> example.oldmain()
[0.0, 1.0]

添加类型映射时,您可能会发现-debug-tmsearch非常方便,即

swig -python -debug-tmsearch example.i

在为寻找合适的“输出”型式时,应明确指出您的型式已被使用float *oldmain。另外,如果您只想访问c全局变量数组,则可以使用typemapvarout代替来完成相同的技巧out



 类似资料:
  • 问题内容: 我正在尝试使用swig从python使用以下原型访问C函数: Swig创建.so没问题,我可以将其导入python,但是当我尝试使用以下命令进行访问时: 我得到以下回溯: 该指针应该是一个int数组,其大小由memoryCells定义 问题答案: 如果可以,请使用ctypes。更简单。但是,由于您要求输入SWIG,因此需要的是一个描述如何处理int *的类型图。SWIG不知道可以指向多

  • 问题内容: 我在header.h内部定义了一个结构,如下所示: 当我用这种结构初始化一个对象时,我可以访问整数/双精度数,但不能访问数组。 如何访问读/写中的值? 问题答案: 最简单的方法是将数组包装在内,然后可以提供额外的方法来满足“可订阅”的要求。 我整理了一个小例子。假定您使用的是C ++,但是从中构造等效的C版本相当简单,它只需要重复一些即可。 首先,具有要包装的C ++头文件和用于包装固

  • 问题内容: 我有一个非常基本的问题。 假设我调用一个函数,例如 如何获得以返回x的功能,以便可以将x用作另一个函数的输入或在程序主体中使用变量? 当我使用return并在另一个函数中调用变量时,我得到了NameError。 问题答案: def foo(): x = ‘hello world’ return x # return ‘hello world’ would do, too

  • 问题内容: 我在python代码中发现了瓶颈,并与psycho等打交道。然后决定编写ac / c ++扩展以提高性能。 借助swig,您几乎不需要关心参数等。一切正常。 现在我的问题是:swig创建了一个很大的py文件,该文件在调用实际的.pyd或.so代码之前会执行很多“检查”和“ PySwigObject”。 你们中的任何人是否有经验,如果您手动编写此文件或让wig来做,是否可以获得更多性能。

  • 问题内容: 我需要用SWIG包装一个C ++库,以便将其与Java一起使用。 我已经有一些方法可以使用,但是遇到一种我不知道如何解决的情况。 我有几种这样的方法: 注意:实际上,这是名为MyClass的类的成员方法。 我可以将第一个方法更改为返回a 而不是being ,它应该可以工作;但是我不知道如何处理第二种方法,其中最后两个参数是输出参数。我已经看到了几个有关输出参数的问题(使用Swig/ P

  • 我在使用SWIG(3.0.6版)围绕C库生成Python包装时遇到了一些问题。 我的问题与应用输出类型映射有关,特别是在类类型的指针/引用的情况下。 为了说明,这就是我想要的标准类型,它是有效的: 您不必传入“resultLong”,但它会自动附加到结果中。太棒了 但是,当输出类型是指向类类型的指针时,这似乎不像我期望的那样工作: 问题似乎是SWIG没有以与简单类型相同的方式处理它。它仍然在包装函

  • 本文向大家介绍Python如何输出整数,包括了Python如何输出整数的使用技巧和注意事项,需要的朋友参考一下 Python输出整数的方法: 先使用str()函数将数字转换成字符串赋值给变量i,再用“if i.count('.') == 0”语句判断字符串中是否没有小数点,如果是则输出这个字符串,这样输出的数字就都是整数了 示例代码如下: 执行结果如下: 实例扩展: Python小数整数输出 输出

  • 问题内容: 我有用swig包装的类的C 代码。我无法修改代码或包装。在python中,我具有使用ctypes的指向所述C 类实例的指针。如何围绕该指针创建一个Swig包装器? 我知道swig对象拥有一个’this’属性,该属性在内部指向包装的对象,但是我找不到一种将其设置为我手头的指针的方法。 谢谢您的帮助! 问题答案: 您 可以 执行此操作,但是这需要大量工作,并且解决使ctypes或SWIG接