使用ctypes创建python模块
我有一个C库,它只有两个函数:使用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_
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的导入与相同的名称混淆。:-)