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

标签 python c swig word-wrap

我试图用 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

有更好的方法吗?或者也许只是一种我可以让它正常工作的方式?

最佳答案

经过大量调查,发现初始化方法中加载 argv 的参数不正确。

如果其他人遇到类似的问题,swig 似乎没有正确包装 argc 和 argv,您可以将类型映射更改为以下内容,以查看您的参数是否被正确传递。希望它能帮助您追查错误的真正来源。

%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); 
}

关于python - 用于可变参数长度的 Swig 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30203410/

相关文章:

c++ - omp_set_max_active_levels() 和函数调用

python - R_PPC_REL24 重定位超出范围

python - 系统路径中安装了多个Python

python - 以单独的名称安装包的分支

python - 我无法向电报机器人用户发送消息,但我自己

Python 和 SWIG - 单个 .pyd (.so) 中的多个模块

python - 从警告中追溯

python - 如何在 Python 中使用 ctypes 创建回调函数?

C语言中的CLOCKS_PER_SEC找到time.h库