用于可变参数长度的 Swig 包装器
Swig wrapper for variable argument lengths
我试图用 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() 时,错误似乎出现了。那里的字符串数组是乱码,我已经能够弄清楚 none 的参数可以被解析,而是系统以存储的默认值启动。
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
有更好的方法吗?或者也许只是一种我可以实际使用它的方法?
经过多方调查发现初始化方法中的参数loading 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;
}
= PyList_Size($input);
= (char **) malloc((+1)*sizeof(char *));
for (i = 0; i < ; i++) {
PyObject *s = PyList_GetItem($input,i);
if (!PyString_Check(s)) {
PyErr_SetString(PyExc_ValueError, "List items must be strings");
return NULL;
}
[i] = PyString_AsString(s);
printf("argv[%d] = %s\n",i,[i]);
}
[i] = 0;
}
%typemap(freearg) (int argc, char *argv[]) {
free();
}
我试图用 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() 时,错误似乎出现了。那里的字符串数组是乱码,我已经能够弄清楚 none 的参数可以被解析,而是系统以存储的默认值启动。
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
有更好的方法吗?或者也许只是一种我可以实际使用它的方法?
经过多方调查发现初始化方法中的参数loading 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;
}
= PyList_Size($input);
= (char **) malloc((+1)*sizeof(char *));
for (i = 0; i < ; i++) {
PyObject *s = PyList_GetItem($input,i);
if (!PyString_Check(s)) {
PyErr_SetString(PyExc_ValueError, "List items must be strings");
return NULL;
}
[i] = PyString_AsString(s);
printf("argv[%d] = %s\n",i,[i]);
}
[i] = 0;
}
%typemap(freearg) (int argc, char *argv[]) {
free();
}