Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 2, 2022 14:21:35

s_oleg
Зарегистрирован: 2022-06-02
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с оберткой для функции из С++ библиотеки

Мне нужно из 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, но нужна именно возможность вызова библиотечной функции.

Офлайн

#2 Июнь 2, 2022 16:27:38

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Помогите с оберткой для функции из С++ библиотеки

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



Офлайн

#3 Июнь 2, 2022 20:02:27

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Помогите с оберткой для функции из С++ библиотеки

https://books.google.ru/books/about/Cython.html?id=ERFkBgAAQBAJ&redir_esc=y

опыта по применению Cython к сожелению нет
так прочитано в прок (и забыто конечно же)



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Июнь 2, 2022 20:15:56)

Офлайн

#4 Июнь 2, 2022 21:17:34

s_oleg
Зарегистрирован: 2022-06-02
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с оберткой для функции из С++ библиотеки

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

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

Офлайн

#5 Июнь 2, 2022 23:38:21

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Помогите с оберткой для функции из С++ библиотеки

s_oleg
Например, чтобы использовать библиотеку в нескольких независимых проектах на разных языках
Имелось ввиду что можно было на С написать.

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

ctypes предназначен для связи с C. Для плюсов используйте pybind11 или boost python. Это убережет вас от написания неправильных своих оберток.



Офлайн

#6 Июнь 2, 2022 23:45:59

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Помогите с оберткой для функции из С++ библиотеки

надо в закладки положить
а что нет поновее чего то



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Июнь 2, 2022 23:49:34)

Офлайн

#7 Июнь 3, 2022 09:28:16

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Помогите с оберткой для функции из С++ библиотеки

s_oleg
Мне нужно из Python вызвать функцию, реализованную в С++ библиотеке. Как понимаю, для этого мне надо создать С-интерфейс для этой библиотеки, а затер с испольованием ctypes реализовать обертку для Python.
s_oleg
FishHook
а назовите пожалуйста хоть одну причину зачем эту функцию делать на С++?
Например, чтобы использовать библиотеку в нескольких независимых проектах на разных языках и платформах и не плодить идентичный код. Чтобы упростить сопровождение, т.к. исправить/изменить в одном месте очевидно быстрее и проще чем в 3-4.
Создай консольную программу на языке C++, которая использует эту библиотеку на языке C++. На вход программе подаётся имя функции и аргументы функции через пробел. На выходе программа пишет ответ, который представляет из себя результат работы функции в виде текста в консоли (через base64 можешь передавать бинарные данные). Когда эта консольная программа будет готова, можешь написать скрипт на питоне, который использует эту консольную программу для задействования функций из библиотеки.
Возможно, это всё по скорости своей работы устроит тебя.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version