1

我一直在试图弄清楚如何包装以下 C 函数 = compress.ccompress.h

我尝试按照教程进行操作,但是在创建.pxd文件后我不知道该怎么做:|

据我了解,这是我应该拥有的 pxd 文件

cdef extern from "compress.h":

    size_t compress(void *s_start, void *d_start, size_t s_len)
    size_t decompress(void *s_start, void *d_start, size_t s_len, size_t d_len)
    uint32_t checksum32(void *cp_arg, size_t length)

在此之后,我不知道该怎么做:|


帮助将是伟大的家伙!=)


编辑:

收到此错误

~/essentials/pylzjb# gcc -I /usr/include/python2.6 -shared -o pylzjb.so pylzjb.c compress.c

/usr/bin/ld: /tmp/ccQLZTaG.o: relocation R_X86_64_32S against `_Py_NoneStruct' 
can not be used when making a shared object; recompile with -fPIC
/tmp/ccQLZTaG.o: could not read symbols: Bad value
collect2: ld returned 1 exit status

无论如何谢谢=)

4

2 回答 2

3

编写一个实现调用 C 函数的包装器的 .pyx 文件?我认为最困难的部分可能是缓冲区处理......

pylzjb.pyx 可能如下所示(注意您的 .pxd 是内联的):

cdef extern from "compress.h":
    size_t compress(void *s_start, void *d_start, size_t s_len)

from stdlib cimport *

def cmpr(bytes s):
    cdef size_t n = len(s)
    cdef unsigned char *dst = <unsigned char *> malloc(n * sizeof(unsigned char))
    try:
        m = compress(<unsigned char *> s, dst, n)
        ret = [dst[i] for i from 0 <= i < m]
    finally:
        free(dst)
    return ret

编译:

cython -I. pylzjb.pyx
gcc -I /usr/include/python2.5 -shared -o pylzjb.so pylzjb.c compres.c

并尝试使用

import pylzjb
pylzjb.cmpr('asfd')
于 2010-07-28T17:17:20.983 回答
1

Google 代码项目 pylzjb 似乎已经为 compress.c|h 实现了 Python 接口?

于 2010-07-28T17:18:35.537 回答