Создание оболочки для библиотеки C в Python - PullRequest
5 голосов
/ 15 мая 2009

Я пытаюсь создать свою собственную оболочку для FLAC, чтобы я мог использовать FLAC в своем собственном коде Python.

Сначала я попытался использовать ctypes, но он показал действительно странный интерфейс с библиотекой, например, все функции инициализации для потоков и файлов FLAC стали одной функцией без реальной информации о том, как ее инициализировать. Тем более, что ему нужна ссылка на потоковый декодер, но Python не имеет возможности хранить указатели ( BZZZT! ), и поэтому я не могу сохранить указатель на потоковый декодер. Не помогает то, что разные функции инициализации имеют разное количество аргументов, а некоторые типы аргументов различаются. У этого также есть много перечислений и структур, и я не знаю, как включить их в мой код.

Я изучал Pyrex, но я столкнулся с той же проблемой с указателями, но думаю, что решил ее, вроде как. Файл тоже не маленький и даже не полный.

Так что я ищу альтернативы или руководства, которые помогли бы мне лучше понять вышеупомянутые способы. Было бы очень полезно, если бы я мог получить рекомендацию и / или помощь.

Ответы [ 5 ]

10 голосов
/ 15 мая 2009

Python не может хранить указатели, и поэтому я не могу сохранить указатель на потоковый декодер

ctypes имеет указатели, а ctypes можно использовать для переноса существующих библиотек C. Просто совет, вам нужно будет обернуть / переписать все соответствующие структуры C в ctypes.Structure. Посмотрите примеры: code.google.com / p / pyxlib-ctypes и code.google.com / p / pycairo-ctypes . Подробнее о том, как отобразить функцию / процедуру и ее argtypes и restype at http://docs.python.org/library/ctypes.html

Я изучал Pyrex, но я столкнулся с той же проблемой с указателями, но, думаю, решил ее, вроде. Файл тоже не маленький и даже не полный.

cython может быть тем, что вам нужно, если вы хотите чистый синтаксис. www.cython.org

Поэтому я ищу альтернативы или руководства, которые помогли бы мне лучше понять вышеупомянутые способы. Было бы очень полезно, если бы я мог получить рекомендацию и / или помощь.

swig с другой стороны, всегда можно использовать, но это сложнее, если вы к этому не привыкли. www.swig.org

5 голосов
/ 15 мая 2009

Вы смотрели на http://www.swig.org/:

SWIG - инструмент разработки программного обеспечения который соединяет программы, написанные на C и C ++ с различными высокоуровневыми языки программирования.

4 голосов
/ 16 мая 2009

но Python не может хранить указатели (BZZZT!)

Это неверно. Вы создаете указатель так:

pInt = POINTER(c_int)()

и вы получаете к нему доступ вот так

pInt[0] # or p.contents
2 голосов
/ 03 апреля 2014

Это сообщение старое, но есть альтернатива ctypes: CFFI . Это намного проще, несколько быстрее и лучше работает под PyPy. Кроме того, он имеет отличную поддержку указателей. Вот пример:

from cffi import FFI

ffi = cffi.FFI()

ffi.cdef('''
struct x { void *a; }

void* get_buffer();
struct x* make_x(void*);
void change_x(struct x*, void*);
''')

dll = ffi.dlopen('libmyawesomelibrary.so')

buf = dll.get_buffer()
tst = dll.new('struct x*')
tst.a = buf
change_x(tst, get_buffer())
tst2 = make_x(get_buffer())
0 голосов
/ 15 мая 2009

Некоторые люди используют для этого пирекс .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...