在Python中加载包含python API代码的共享库?

时间:2011-06-28 03:17:13

标签: python ctypes

我正在自动生成一些C代码,将其编译为共享库并使用ctypes加载它,我很好奇是否有人可以告诉我使用部分Python API可能需要什么从这样的库中(没有创建一个完整的模块)

例如,我有一些快速代码被黑客攻击:

PyObject* test() {
  PyObject* to_ret = NULL;
  PyGILState_STATE gstate = PyGILState_Ensure();

  to_ret = Py_BuildValue("i", 1+2);

  PyGILState_Release(gstate);

  return to_ret;
}

我将其编译为.so并使用ctypes加载。

但是,当我运行以上内容时,我得到:

>>> ctypes.CDLL("test.so").test()
138145104

所以我显然做错了什么。欢迎任何想法/提示。

: Aha,上面的工作但是ctypes默认需要一个int返回类型,因此将PyObject *转换为整数。似乎没有办法使用ctypes返回一个任意python对象,所以生成一个完整的模块似乎是要走的路。

1 个答案:

答案 0 :(得分:3)

似乎可以在Python 2.7中完成,它支持ctypes.py_object作为类型。我根据您的示例代码构建了一个库,并使用了以下内容:

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> t = CDLL('test').test
>>> t.restype = py_object
>>> t()
3