我正在尝试为FLAC创建自己的包装器,以便我可以在自己的Python代码中使用FLAC。
我首先尝试使用ctypes,但它显示了一个非常奇怪的库接口,例如FLAC流和文件的所有init函数都成为一个函数,没有关于如何初始化它的真实信息。特别是因为它想要引用流解码器,但Python无法存储指针(BZZZT!),因此我无法将指针存储到流解码器。不同的init函数具有不同数量的参数并且一些参数类型不同也没有帮助。它也有很多枚举和结构,我不知道如何将它们放入我的代码中。
我一直在调查Pyrex,但我遇到了与指针相同的问题,但我想我已经解决了它的问题。 The file isn't small either, and it's not even complete.
所以我正在寻找可以帮助我更好地理解上述方法的替代方案或指南。如果我能得到推荐和/或帮助,那将会非常有帮助。
答案 0 :(得分:10)
Python没有办法存储指针,因此我无法将指针存储到流解码器
ctypes 有指针,ctypes可用于包装现有的C库。只需一个提示,您需要将所有相关C结构包装/重写为ctypes.Structure。 请查看示例:code.google.com/p/pyxlib-ctypes和code.google.com/p/pycairo-ctypes。更多信息如何在http://docs.python.org/library/ctypes.html
上映射函数/过程及其 argtypes 和 restype如果您想要干净的语法,我一直在调查Pyrex,但我遇到了与指针相同的问题,但我想我已经解决了它的问题。该文件也不小,甚至还不完整。
cython 可能就是您所需要的。 www.cython.org
另一方面,所以我正在寻找可以帮助我更好地理解上述方法的替代方案或指南。如果我能得到推荐和/或帮助,那将会非常有帮助。
swig 总是可以使用但如果你不习惯它会更复杂。 www.swig.org
答案 1 :(得分:5)
SWIG是一种软件开发工具 连接用C编写的程序 和C ++一起使用各种高级 编程语言。
答案 2 :(得分:4)
但Python无法存储指针(BZZZT!)
这是不正确的。你创建一个像这样的指针:
pInt = POINTER(c_int)()
你可以像这样访问它
pInt[0] # or p.contents
答案 3 :(得分:2)
这篇文章已经过时了,但可以选择ctypes
:CFFI。它更容易,更快,并且在PyPy下工作得更好。此外,它对指针有很大的支持。这是一个例子:
from cffi import FFI
ffi = cffi.FFI()
ffi.cdef('''
struct x { void *a; }
void* get_buffer();
struct x* make_x(void*);
void change_x(struct x*, void*);
''')
dll = ffi.dlopen('libmyawesomelibrary.so')
buf = dll.get_buffer()
tst = dll.new('struct x*')
tst.a = buf
change_x(tst, get_buffer())
tst2 = make_x(get_buffer())
答案 4 :(得分:0)
有些人为此使用pyrex。