iiv 18 7 марта Опубликовано 7 марта · Жалоба Добрый день, питон не знаю, каюсь. Вернее знаю на уровне хелло-ворлда, но писать на питоне не умею. С и С++ знаю хорошо. От меня требуют срочно закодить довольно сложный кусок кода на питоне, причем этот код сильно похож (но не идентичен) тому, что я уже недавно кодил на С для обычного ESP32. Ожидаемая длина кода на С/С++ - порядка 30 тысяч строк, грубо говоря 70% у меня есть, я сам писал, могу модифицировать. Про онлайн трансляторы знаю, но не верю, что это надежно. Код, что у меня есть, почти С, а не С++, там классы по минимуму использованы, но есть много вызовов бласов и лапака (blas/lapack), которые, как я понимаю, видны из питона довольно нативно. Хочу чего-то в виде транслятора, желательно под линукс. Скажите, пожалуйста, где достать надежный транслятор (типа f2c) с С на питон, однозначно чтоб офф-лайн работало, и, желательно бесплатно. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 8 марта Опубликовано 8 марта · Жалоба Вам нужно именно С в питон перегнать или можно из питона вызвать 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++. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться