【发布时间】:2021-03-29 01:34:05
【问题描述】:
我有一个只有两个函数的 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 下载的包。我在正确的轨道上吗?我不想要轮子,因为代码很小并且没有依赖关系。因此我应该快速编译并且应该非常便携。
【问题讨论】:
-
顺便说一句,
global语句完全没有必要,您应该删除它们。 -
@juanpa.arrivillaga 我删除了
global _lib。谢谢 -
在这种情况下,动态模块名称以下划线开头:_foo.so。
标签: python pip ctypes python-module