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)
1
1
私は次の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インターフェースを実装しているようですか?