Перейти к содержанию
    

C/C++ to Python: как странслировать большой кусок кода?

Добрый день,

питон не знаю, каюсь. Вернее знаю на уровне хелло-ворлда, но писать на питоне не умею. С и С++ знаю хорошо. От меня требуют срочно закодить довольно сложный кусок кода на питоне, причем этот код сильно похож (но не идентичен) тому, что я уже недавно кодил на С для обычного ESP32.

Ожидаемая длина кода на С/С++ - порядка 30 тысяч строк, грубо говоря 70% у меня есть, я сам писал, могу модифицировать. Про онлайн трансляторы знаю, но не верю, что это надежно. Код, что у меня есть, почти С, а не С++, там классы по минимуму использованы, но есть много вызовов бласов и лапака (blas/lapack), которые, как я понимаю, видны из питона довольно нативно.

Хочу чего-то в виде транслятора, желательно под линукс.

Скажите, пожалуйста, где достать надежный транслятор (типа f2c) с С на питон, однозначно чтоб офф-лайн работало, и, желательно бесплатно.

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам нужно именно С в питон перегнать или можно из питона вызвать C/C++ реализацию?

Насчёт трансляторов сомневаюсь. В питоне просто некоторые вещи реализованы принципиально иначе -- например, С/C++ массив не очень транслируется в питоновые типы, это лучше заменять numpy массивами, которые помимо хорошей эффективности ещё и тянут за собой приличного размера библиотеку (в т.ч. реализацию тех же BLAS/LAPACK). В общем, там в каждом случае надо оценивать, во что выливается транслированное  значение. 

Если же просто требование запускать код на питоне, то я бы C/C++ оформил в виде некоего API, которое "пробросил" на уровень Python, откуда просто вызывать эти функции/объекты.

Существует энное количество способов это сделать: https://realpython.com/python-bindings-overview/. Я использовал boost-python. Технически код на C/C++ компилируется в динамическую библиотеку (dll/so), которая в коде Python просто импортируется стандартным образом (import <module-name>). например, в C/C++ исходнике:

// slon.c compiled to shared library slon.so

int a;
int b;

int fun_add(int x, int y)
{
    return x + y;
}  

BOOST_PYTHON_MODULE(slon)
{
    using namespace boost::python;

    //--------------------------------------------------------------------------
    //
    //    exposed variables
    //
    scope().attr("c_var_a") = a;
    scope().attr("c_var_b") = b;

    //--------------------------------------------------------------------------
    //
    //    exposed functions
    //
    def("c_fun_add", fun_add);
}
//------------------------------------------------------------------------------

В Python:

import slon
from slon import c_var_b
from slon import с_fun_add as add

a = slon.c_var_a

result = add(10, 20) - a + c_var_b
<...>

Таким образом можно гибко распределить код между языками, это будет по гибкости и удобству Python, а по эффективности C/C++.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...