1


1

Cythonを使用したCラッパーの作成-Python

私は次のC関数をラップする方法を見つけようとしています= compress.c、http:/ /code.google.com/p/pylzjb/source/browse/trunk/compress.h[compress.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

とにかく=)

2 Answer


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 =  malloc(n * sizeof(unsigned char))
    try:
        m = compress( 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')


1


Googleコードプロジェクトpylzjbはすでにcompress.c | hのPythonインターフェースを実装しているようですか?