【问题标题】:Finding the simplest way to wrap a double->double C function to Python寻找将 double->double C 函数包装到 Python 的最简单方法
【发布时间】:2015-04-27 04:49:11
【问题描述】:

我需要封装一个接口的C函数

double foo(double)

到python,以便在python控制台中

>>foo_py(2.9)

应该给我 foo(2.9) 的 double 值。最终,我在 scipy 中使用了导出的 foo_py。

我一直在寻找包装这样一个 C 函数的 最简单 方法。stackoverflow 上肯定有很多相关的帖子,但它们都是几年前的,现在我正在寻找对于我的具体需求的更新答案。谢谢。

[编辑] 有关信息,我尝试使用 PyObj 等进行 C 扩展。这方面的文档似乎缺乏。我还尝试了将 C++ 函数包装到 Python 的 Boost.Python。这里我需要对 C 函数进行包装(以避免命名拆解等问题)。

【问题讨论】:

  • 使用 ctypes 应该很简单:stackoverflow.com/a/145649/1470749
  • @figs 谢谢。你给我的链接看起来很不错。等别人回复的时候让我看看。
  • @fig 奇怪。包装的函数总是返回 0。我的代码就像他的: import ctypes from ctypes import cdll lib=cdll.LoadLibrary("./libfoo.so") lib.foo_r.argtypes=(ctypes.c_double,) lib.foo_r.restypes=ctypes.c_double print lib. foo_r(9)
  • 奇怪,您必须发布所有 Python 和 C 代码供我们检查。
  • @fig 感谢您的帮助。我的 C 代码很大。上面发布为 cmets 的 python 代码。稍后我可能会打开一个新帖子,但现在我使用 Everlisle 的解决方案。有用。谢谢。

标签: python c wrapper


【解决方案1】:

下面是一个简单的例子:

test.c

#include <Python.h>

static PyObject* foo(PyObject* self, PyObject* args) {
  double d;
  PyArg_ParseTuple(args, "d", &d);
  return Py_BuildValue("d", d);
}

// Bind python function to C function
static PyMethodDef simplemodule_methods[] = {
  {"foo_py", foo, METH_VARARGS},
  {NULL, NULL, 0}
};

// Initialize module
void inittest() {
  (void) Py_InitModule("test", simplemodule_methods);
}

test.py

from test import *
print foo_py(2.9) # will output 2.9

编译

gcc -shared -fPIC -I/usr/include/python2.7 -o test.so test.c

运行

python test.py

【讨论】:

    【解决方案2】:

    这是我的视频,祝你好运https://asciinema.org/a/18926

    【讨论】:

      猜你喜欢
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      相关资源
      最近更新 更多