我有一個全局變量數組,我想拉入python。而我在與varout
類型映射的困難:用swig和python擴展全局c變量數組
/* example.c */
int foo[] = {0, 1};
,這裏是非常香草接口:
/* example.i */
%module example
%{
extern int foo[2];
%}
%typemap(varout) int foo[] {
int i;
//$1, $1_dim0, $1_dim1
$result = PyList_New($1_dim0);
for (i = 0; i < $1_dim0; i++) {
PyObject *o = PyInt_FromLong((double) $1[i]);
PyList_SetItem($result,i,o);
}
}
%include "example.c"
當我嘗試用下面的SConstruct構建它:
import distutils.sysconfig
env = Environment(SWIGFLAGS='-python -shadow -Wall'.split(),
CPPPATH=[distutils.sysconfig.get_python_inc()],
SHLIBPREFIX="")
env.SharedLibrary('_example.so', ['example.c', 'example.i'])
$1_dim0
特殊變量未填充,導致在example_wrap.c
中產生以下非編譯代碼:
SWIGINTERN PyObject *Swig_var_foo_get(void) {
PyObject *pyobj = 0;
{
int i;
//foo, , foo_dim1
pyobj = PyList_New();
for (i = 0; i < ; i++) {
PyObject *o = PyInt_FromLong((double) foo[i]);
PyList_SetItem(pyobj,i,o);
}
}
return pyobj;
}
所以很明顯,typemap匹配已經發生,但是數組的維數缺失。我錯過了什麼?硬編碼的維度確實有用。
一般來說,有什麼辦法可以用swig來擴展全局cvar
變量嗎?
$ swig -version
SWIG Version 2.0.4
Compiled with g++ [i686-pc-linux-gnu]
Configured options: +pcre
Please see http://www.swig.org for reporting bugs and further information
我展示瞭如何讓你的榜樣工作,但我有點不清楚什麼你的意思是:*「一般來說,有什麼方法可以用swig擴展全局cvar變量嗎?」* - 除了修改typemap之外,還有更多嗎? – Flexo 2012-07-27 21:02:34
我想知道是否可以用'__getitem __()'擴展'foo'變量類型,使其可以用[]編寫腳本。 – Oleksiy 2012-07-27 23:02:35
不是PyList已經可以下載嗎? – Flexo 2012-07-28 09:33:46