我正在自动生成一些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对象,所以生成一个完整的模块似乎是要走的路。
答案 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