実際、 Python を使用したまさにこの種の関数の例が SWIG ドキュメントにあります。マイナーな変更を加えてここに引用しました:
%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"])
はSWIGtest
に付けたモジュールの名前で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[]);
十分なものです。