Создание оболочки C с помощью Cython - Python

1

Я пытался выяснить, как обернуть следующие функции C = compress.c, 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

спасибо в любом случае =)

Теги:
cython
boost-python

2 ответа

3
Лучший ответ

напишите файл .pyx, который реализует оболочку, вызывающую функции C? Я думаю, что самой сложной частью может быть обработка буфера...

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')
  • 0
    pmeerw: я очень рад, что получил твой ответ, большое спасибо!
  • 0
    насколько иначе будет распаковка? это функция, которая мне действительно нужна. Еще раз спасибо
Показать ещё 1 комментарий
1

Проект кода Google pylzjb, похоже, реализует интерфейс Python для compress.c | h уже?

  • 0
    Я понятия не имею, как его использовать: |
  • 0
    Если вы говорите о двоичных файлах, они не совместимы с моей системой, Linux 64bit
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню