【问题标题】:Loading shared library in Python that contains python API code?在包含 python API 代码的 Python 中加载共享库?
【发布时间】: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

标签: python ctypes


【解决方案1】:

它似乎可以在 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

【讨论】:

    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2012-07-08
    • 2023-03-24
    相关资源
    最近更新 更多