【发布时间】:2011-06-28 03:17:13
【问题描述】:
我正在尝试自动生成一些 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
所以我显然做错了什么。欢迎任何想法/提示。
解决方案: 啊哈,上面的 确实 工作,但默认情况下 ctypes 需要一个 int 返回类型,因此将 PyObject* 转换为整数。似乎没有办法使用 ctypes 返回一个任意的 python 对象,所以生成一个完整的模块似乎是要走的路。
【问题讨论】:
-
好吧,逗我开心。如果您使用的是 Python API,为什么不想编写一个模块?
-
我只是在玩弄一个库,它可以让您在 C 中快速编写数字代码的 sn-ps 并将它们绑定到函数名。为每个构建一个模块并慢慢污染 sys.modules 似乎很浪费。另外,这种方式更具挑战性。 =D