使用ctypes创建python模块

使用ctypes创建python模块,python,pip,ctypes,python-module,Python,Pip,Ctypes,Python Module,我有一个C库,它只有两个函数:char*foo\u decode(const char*)和const char*foo\u 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_

我有一个C库,它只有两个函数:
char*foo\u decode(const char*)
const char*foo\u 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')
我跟着

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

但是当我导入我的模块文件(
import foo
)时,我得到了一个错误
import错误:动态模块没有定义模块导出函数(PyInit\u foo)

发生了什么,我应该如何解决此问题


我的目标是生成一个可通过pip安装下载的包。我走对了吗?我不想要轮子,因为代码很小并且没有依赖性。因此,我的编译速度应该很快,而且应该是非常可移植的。

您有一个共享库
foo.so
和一个模块
foo.py
。当Python导入foo时,它只加载其中一个;在你的例子中是foo.so;但是
foo.so
不是Python模块,因此出现了错误


将您的
foo.py
重命名为不同的名称,如
foo\u wrapper.py
,然后尝试
import foo\u wrapper

作为旁白,
global
语句完全没有必要,您应该删除它们。@juanpa.arrivillaga我删除了
global\u库
。感谢您在这种情况下,动态模块名称以下划线开头:\ u foo.so.this有效。非常感谢你。生成.so文件时,我有点快。通常,.so文件名为
libfoo.so
。这本可以避免混乱。我更喜欢叫模块
foo
。当然,所有的名字都由你决定。只是不要将Python的导入与相同的名称混淆。:-)