实际上,SWIG文档中有一个使用Python进行此类功能的示例。我在这里引用了一个小的更改:
Run Code Online (Sandbox Code Playgroud)%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 }
这使您可以在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)
足够了。