使用 ctypes 创建一个 python 模块

creating a python module using ctypes

我有一个只有两个函数的 C 库:char *foo_decode(const char*)const char *foo_version()

我现在想创建一个允许调用这两个函数的 python 模块。

C库编译成foo.so.

这是我的 python 模块文件:

$ cat foo.py
import ctypes as ct

_lib = ct.cdll.LoadLibrary("./foo.so")
_lib.foo_decode.argtypes = [ct.c_char_p]
_lib.foo_decode.restype = ct.c_char_p
_lib.foo_version.argtypes = []
_lib.foo_version.restype = ct.c_char_p

def decode(fooText):
    return _lib.foo_decode(fooText.encode('utf8')).decode('utf-8')
    
def version():
    return _lib.foo_version().decode('utf-8')

我关注了this tutorial

当我启动 python3 解释器并手动执行时。一切正常。 我可以调用函数并返回预期结果。

但是当我导入我的模块文件 (import foo) 时,我收到错误 ImportError: dynamic module does not define module export function (PyInit_foo)

这是怎么回事,我应该怎么做才能解决这个问题?

我的目标是制作一个可使用 pip install 下载的包。我在正确的轨道上吗?我不想要轮子,因为代码很小而且没有依赖关系。因此,我应该可以快速编译并且应该非常便携。

您有一个共享库 foo.so 和一个模块 foo.py。当 Python 执行 import foo 时,它只加载其中一个;在你的情况下是 foo.so;但 foo.so 不是 Python 模块,因此出现错误。

将您的 foo.py 重命名为 foo_wrapper.py 等其他名称,然后尝试 import foo_wrapper