LINUX.ORG.RU

Подойдёт ли swig, чтобы из python работать с сторонней сишной библиотекой?

 ,


0

1

Доброго времени суток

Сабж. Возникла необходимость из python дёргать api, предназначенный для Си. хедеры есть. Нужно написать wrapper

Гугл говорит, что для этой задачи есть SWIG. Но почему-то во всех примерах, что я видел, библиотека компилируется с подключением чего-то питоньего. Т.е. получается не питоний wrapper над сишной либой, а наоборот модифицировання сишная либа для дальнейшего связывания с питоньим модулем

API не мой, подменять библиотеки я не могу. Подойдёт ли мне SWIG?

Скажите что да, и я пойду курить доки. Не хочется сначала изучить, а потом понять что это не под мою задачу :)

★★★★★

Мне swig показался монстром, я делал обёртки на cython.

Так же, возможно, тебе хватит простого ctypes.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Но в принципе он это может? Не модифицировать сишную библиотеку, а собрать wrapper для python и использовать её как есть?

Монстр так монстр. Мне как раз придётся работать с большим и серьёзным API AIX'а. И то, что swig уже есть в perzl - дар небес :)

router ★★★★★
() автор топика
Ответ на: комментарий от hippi90

https://docs.python.org/3/extending/index.html#creating-extensions...

Если ты рекомендуешь написать свой экстеншн то я крайне рекомендую этого не делать. Гораздо лучше cython, не придётся гемороится со ссылками, эксепшенами, утечками памяти и прочим. Или ctypes.

Но в принципе он это может?

Может. Отговаривать не буду.

true_admin ★★★★★
()

Сколько функций надо обернуть? Если десяток, то лучше cffi или cython. Или вообще ctypes.

anonymous
()

Зачем? В питоне есть cffi, там все элементарно. Зачем еще что-то сверху наворачивать?

Aswed ★★★★★
()

Ответ: да, подойдёт. Вот минимальный пример

  1. собираем тестовую библиотеку

    hello.c:

    #include <stdio.h>
    
    void echo(void) {
        printf("\"Hello World\"\n");
    }
    

    hello.h

    extern void echo(void);
    

    сборка:

    gcc -shared hello.o -o libhello.so
    

  2. простейший экзешник для проверки библиотеки

    test.c

    #include "hello.h"
    
    int main() {
            echo();
    }
    

    собираем, проверяем

    $ gcc test.c -L . -l hello -o test
    $ LD_LIBRARY_PATH=. ./test
    "Hello World"
    

  3. теперь создаём и собираем wrapper

    myhello.i:

    %module myhello
    
    %{
    #include "hello.h"
    %}
    
    %include "hello.h"
    

    собираем

    swig -python -I myhello.i 
    gcc -shared -fPIC myhello_wrap.c -I/usr/include/python2.7  -L . -l hello -o _myhello.so
    

    проверяем

    $ export LD_LIBRARY_PATH=.
    $ python
    [..]
    >>> import myhello
    >>> myhello.echo()
    "Hello World"
    

    Профит :)

router ★★★★★
() автор топика

Всем спасибо. Потом посмотрю на cython и cffi, если останется время, но пока мне явно хватает swig. Тем более что он всё сделает за меня :)

router ★★★★★
() автор топика
Ответ на: комментарий от Sahas

Это там где надо самому писать код на чистом Си, переводя функции и объекты в соответствие с объектной моделью питона?

Спасибо, нафиг :D

router ★★★★★
() автор топика

есть еще pybind11 (и автогенератор правил для него binder, но он имеет куцую документацию и вобще какойто недоделаный), что то типа бустпитона только без буста.

anonymous
()
Ответ на: комментарий от Sahas

ЗЫ Анон на 9 сек раньше успел :)

анон бдит

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.