Swig包装器用于可变的参数长度

预订

我试图用swig包装下面的方法,并且似乎在将argc和agrv值从server.py传递到下面的rtserver.c方法中时遇到了一些麻烦。

int initialize(int run, int argc,char *argv[]) {

这是rtserver.i中应处理数据的部分。

%include <argcargv.i>

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

在实现包装的rtserver方法的server.py文件中,我尝试采用从命令行传入的参数,然后将其发送到包装的消息中。

c = sys.argv[1:]
sock = rtserver.initialize(0,c)

从运行时server.py文件的输出可以看出。似乎字符串数组已正确读取到server.py文件中。将数组传递给rsterver.initialize()时,似乎会显示该错误。从我发现无法解析任何参数的地方,字符串数组出现了乱码,而是使用存储的默认值启动了系统。

python server.py -rp 41104 -ep 41000 -tp 10011
['-rp', '41104', '-ep', '41000', '-tp', '10011']

Fri May  1 22:57:11 2015: 7429 : rtserver :Started (version 1.6) listening on port 41103 for control program, and on port 1024 for clients

有一个更好的方法吗?还是只是我可以真正使用它的一种方法?

预订

经过大量调查,结果发现在initialize方法中加载argv的参数不正确。

如果其他人遇到了类似的问题,似乎swig不能正确包装argc和argv,则可以将typemap更改为以下内容,以查看是否正确传递了参数。希望它可以帮助您找到错误的真正原因。

%typemap(in) (int argc, char *argv[]) {
      int i = 0;
      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)) {
            PyErr_SetString(PyExc_ValueError, "List items must be strings");
            return NULL;
        }
        $2[i] = PyString_AsString(s);
        printf("argv[%d] = %s\n",i,$2[i]);
      }
      $2[i] = 0;
}

%typemap(freearg) (int argc, char *argv[]) {
       free($2); 
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章