gpt4 book ai didi

用于读取可变参数长度的 Python C 包装器

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:19 25 4
gpt4 key购买 nike

我正在尝试替换 MATLAB/MEX 并切换到 Python。我发现 SWIG、ctypes 和 Cython 作为可能的解决方案,并开始尝试 SWIG(这看起来非常简单)。

我的 C 函数具有 main(int argc, char *argv[]) 形式的可变参数长度。我在网上找到了解决方案,但与 SWIG 一起使用会导致很多问题。

  1. 其他方法(ctypes/Cython)更简单吗?
  2. 任何使用 SWIG 执行此任务的示例都会有所帮助。

最佳答案

实际上有an example in the SWIG documentation使用 Python 就可以实现此类功能。我在这里引用了它,并做了一些小小的修改:

%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"])

其中 test 是您为 SWIG 提供的模块的名称,foo 是与签名 int argc, char *argv[].对于 Python 程序员来说使用起来简单直观,并且它封装并重用了复杂的部分。

<小时/>

文档似乎没有提到的是,已经有一个接口(interface)文件可以为您完成所有这些操作:

%module test

%include <argcargv.i>

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

void foo(int argc, char *argv[]);

足够了。

关于用于读取可变参数长度的 Python C 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59756800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com