Найти - Пользователи
Полная версия: Помогите с оберткой для функции из С++ библиотеки
Начало » Python для экспертов » Помогите с оберткой для функции из С++ библиотеки
1
s_oleg
Мне нужно из Python вызвать функцию, реализованную в С++ библиотеке. Как понимаю, для этого мне надо создать С-интерфейс для этой библиотеки, а затер с испольованием ctypes реализовать обертку для Python.

Сама функция, к которой нужна обертка выглядит так
std::string extractFromGpkgEnvelope( const std::string &envelope )
{
int headerSize = parseHeaderSize( envelope );
std::string body( envelope.size() - headerSize, 0 );
memcpy( &body[0], &envelope[headerSize], envelope.size() - headerSize );
return body;
}

С-интерфейс реализовал так
const char *MYLIB_extractFromEnvelope( const char *envelope )
{
return extractFromGpkgEnvelope( std::string(envelope) ).c_str();
}

А вызываю из Python так
 def from_envelope(envelope):
    func = lib.MYLIB_extractFromEnvelope
    func.restype = ctypes.c_char_p
    body = func(ctypes.c_char_p(envelope))
    return body.decode('utf-8')

К сожалению, такая реализация не работает. Ранее никогда таким не занимался, да и знания С/С++ у меня особого нет. Помогите, пожалуйста.

Я знаю, что эту же функцию можно реализовать на чистом Python, но нужна именно возможность вызова библиотечной функции.
FishHook
s_oleg
Сама функция, к которой нужна обертка выглядит так
а назовите пожалуйста хоть одну причину зачем эту функцию делать на С++?
AD0DE412
https://books.google.ru/books/about/Cython.html?id=ERFkBgAAQBAJ&redir_esc=y

опыта по применению Cython к сожелению нет
так прочитано в прок (и забыто конечно же)
s_oleg
FishHook
а назовите пожалуйста хоть одну причину зачем эту функцию делать на С++?

Например, чтобы использовать библиотеку в нескольких независимых проектах на разных языках и платформах и не плодить идентичный код. Чтобы упростить сопровождение, т.к. исправить/изменить в одном месте очевидно быстрее и проще чем в 3-4.
doza_and
s_oleg
Например, чтобы использовать библиотеку в нескольких независимых проектах на разных языках
Имелось ввиду что можно было на С написать.

От языка тут правда ничего не зависит. Вашу обертку если из C++ или С вызывать то все равно все сломается.

ctypes предназначен для связи с C. Для плюсов используйте pybind11 или boost python. Это убережет вас от написания неправильных своих оберток.
AD0DE412
надо в закладки положить
а что нет поновее чего то
py.user.next
s_oleg
Мне нужно из Python вызвать функцию, реализованную в С++ библиотеке. Как понимаю, для этого мне надо создать С-интерфейс для этой библиотеки, а затер с испольованием ctypes реализовать обертку для Python.
s_oleg
FishHook
а назовите пожалуйста хоть одну причину зачем эту функцию делать на С++?
Например, чтобы использовать библиотеку в нескольких независимых проектах на разных языках и платформах и не плодить идентичный код. Чтобы упростить сопровождение, т.к. исправить/изменить в одном месте очевидно быстрее и проще чем в 3-4.
Создай консольную программу на языке C++, которая использует эту библиотеку на языке C++. На вход программе подаётся имя функции и аргументы функции через пробел. На выходе программа пишет ответ, который представляет из себя результат работы функции в виде текста в консоли (через base64 можешь передавать бинарные данные). Когда эта консольная программа будет готова, можешь написать скрипт на питоне, который использует эту консольную программу для задействования функций из библиотеки.
Возможно, это всё по скорости своей работы устроит тебя.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB