Python C包装器,用于读取可变参数长度

SEU*_*SEU 0 python swig ctypes cython word-wrap

我正在尝试替换MATLAB / MEX并切换到Python。我遇到了SWIG,ctypes和Cython作为可能的解决方案,并开始尝试SWIG(这似乎很简单)。

我的C函数具有形式可变的参数长度main(int argc, char *argv[])。我在网上找到了解决方案,但是与SWIG一起使用会导致很多问题。

  1. 其他方法(ctypes / Cython)更简单吗?
  2. 使用SWIG进行此任务的任何示例都将有所帮助。

Fle*_*exo 6

实际上,SWIG文档中一个使用Python进行此类功能的示例。我在这里引用了一个小的更改:

%typemap(in) (int argc, char *argv[]) {
  int i;
  if (!PyList_Check($input)) {
    PyErr_SetString(PyExc_ValueError, "Expecting a list");
    return NULL;
  }
  $1 = PyList_Size($input);
  $2 = (char **) malloc(($1+1)*sizeof(char *));
  for (i = 0; i < $1; i++) {
    PyObject *s = PyList_GetItem($input,i);
    if (!PyString_Check(s)) {
        free($2);
        PyErr_SetString(PyExc_ValueError, "List items must be strings");
        return NULL;
    }
    $2[i] = PyString_AsString(s);
  }
  $2[i] = 0;
}

%typemap(freearg) (int argc, char *argv[]) {
   free($2); // If here is uneeded, free(NULL) is legal
}
Run Code Online (Sandbox Code Playgroud)

这使您可以在Python中简单地执行以下操作:

import test
test.foo(["a", "b", "c"])
Run Code Online (Sandbox Code Playgroud)

test您为SWIG提供的模块的名称在哪里,并且foo是与签名匹配的函数int argc, char *argv[]。对于Python程序员而言,使用起来简单直观,它封装并重用了复杂的位。


尽管该文档似乎没有提到,但是已经有一个接口文件为您完成了所有这些工作:

%module test

%include <argcargv.i>

%apply (int ARGC, char **ARGV) { (int argc, char *argv[]) }

void foo(int argc, char *argv[]);
Run Code Online (Sandbox Code Playgroud)

足够了。