2010-07-28 5 views
1

J'ai essayé de comprendre comment encapsuler les fonctions C suivantes = compress.c, compress.h.Création d'un wrapper C avec Cython - Python

J'ai essayé de suivre les tutoriels, mais après avoir créé le fichier .pxd je ne sais pas quoi faire: |

D'après ce que je comprends c'est le fichier PXD que je devrais avoir

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) 

Après cela, je n'ai aucune idée quoi faire: |


aide serait super les gars! =)


Edit:

Obtenir cette erreur

~/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 

merci quand même =)

Répondre

3

écrire un fichier .pyx qui implémente une enveloppe appelant les fonctions C? Je pense que la partie la plus difficile est peut-être un tampon de traitement ...

pylzjb.pyx pourrait se présenter comme suit (notez que votre .pxd est inline):

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 

compiler avec:

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

et essayez d'utiliser avec

import pylzjb 
pylzjb.cmpr('asfd') 
+0

pmeerw: Je suis vraiment contente d'avoir reçu votre réponse, merci beaucoup! – RadiantHex

+0

comment décompresser serait différent? C'est la fonction dont j'ai vraiment besoin. Merci encore – RadiantHex

+0

@pmeerw Pourquoi utilisez-vous "size_t" ici, au lieu de "int", ou similaire? – theJollySin

1

le projet de code Google pylzjb semble mettre en œuvre un Pyt interface hon pour compress.c | h déjà?

+0

Je n'ai aucune idée de comment l'utiliser: | – RadiantHex

+0

Si vous parlez des binaires, ils ne sont pas compatibles avec mon système, linux 64bit – RadiantHex

+1

Le 'setup.py' ne fonctionnera pas en raison d'un module qui semble n'exister que sur le disque dur de l'auteur. –