0 / 0 / 0
Регистрация: 20.03.2020
Сообщений: 23

На сколько сложно перевести код Python на Си?

04.04.2020, 13:55. Показов 3532. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возможно ли код Python перевести на 'С' без больших потерь?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.04.2020, 13:55
Ответы с готовыми решениями:

Перевести код из c++ в python
необходимо перевести это решение на python. Вот тест программы:...

Перевести код из СИ в Python
#include <stdio.h> #include <conio.h> #include <math.h> #include <windows.h> char bufRus; char* ru(const char*text) { ...

Перевести код с C# на Python
private void textBox1_TextChanged(object sender, EventArgs e) { string words = GetStringFromFile("D:\\text.txt").Split(' '); ...

11
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.04.2020, 14:56
Цитата Сообщение от lo1kit Посмотреть сообщение
Возможно ли код Python перевести на 'С' без больших потерь?
Нет - невозможно.
Если твой код это никому ненужный hello world на пару-тройку циклов и арифметич. операций, то легко.
Если твой код основан на библиотеках - уже нет.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
05.04.2020, 16:11
Смотря что вы хотите получить.
Есть pypy.
Есть cython:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import cython
 
if cython.compiled:
    print("Yep, I'm compiled.")
else:
    print("Just a lowly interpreted script.")
 
x = cython.declare(cython.int)              # cdef int x
y = cython.declare(cython.double, 0.57721)  # cdef double y = 0.57721
 
def func():
    # Cython types are evaluated as for cdef declarations
    x: cython.int               # cdef int x
    y: cython.double = 0.57721  # cdef double y = 0.57721
    z: cython.float = 0.57721   # cdef float z  = 0.57721
 
    # Python types shadow Cython types for compatibility reasons
    a: float = 0.54321          # cdef double a = 0.54321
    b: int = 5                  # cdef object b = 5
    c: long = 6                 # cdef object c = 6
    pass
 
@cython.cclass
class A:
    a: cython.int
    b: cython.int
 
    def __init__(self, b=0):
        self.a = 3
        self.b = b
Или хотите переписать модуль для питона на Си?

Добавлено через 2 минуты
Конце в концов питон можно встроить в сишную программу (будет толше на целый libpython.so)

Добавлено через 2 минуты
https://www.cyberforum.ru/post2998458.html

Добавлено через 39 секунд
Функционал для работы с текстами в файлах
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
05.04.2020, 21:15
Можно написать конвертер. Инструкция в книге авторов Уэйт, Прата, Мартин "Язык Си" 1988 год, страница 78 (в бумажной книге). Если надо будет найти это место в электронной, могу посмотреть ключевую фразу для поиска.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
05.04.2020, 21:23
numba с JIT-компиляцией уделывает чистый питон в сто раз.
cython, который я приводил выше, где-то 80-90 раз быстрее.

Цитата Сообщение от supmener Посмотреть сообщение
Можно написать конвертер.
Ха-ха три раза. Начни с написания токенайзера питона, а я запасусь попкорном.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.04.2020, 21:25
Цитата Сообщение от supmener Посмотреть сообщение
Можно написать конвертер.
Зачем вы все упрощаете?
Все гораздо сложнее, чем вы себе можете представить.

Существующие ретрансляторы Python to C++ умеют это делать с очень большими ограничениями.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
05.04.2020, 21:40
Garry Galler, на самом деле выхлоп таких конвертеров бывает нормальным. Но опять же для очень простых случаев с ручной расстановкой типов переменных:

Python
1
2
3
r: complex = n + 4
for i in range(1_000_000):
    r += i
C
1
2
3
4
r = __pyx_t_double_complex_from_parts((n + 4.0), 0);
for (i = 0; i < 0xF4240; i+=1) {
    r = __Pyx_c_sum_double(r, __pyx_t_double_complex_from_parts(i, 0));
}
В остальном полностью соглашусь: автоматический конвертер в компилируемый язык невозможен, в том числе из-за излишней иммунабельности питона и его принципа "всё есть объект".
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.04.2020, 22:16
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
выхлоп таких конвертеров бывает нормальным
А какая команда? И каким именно: nuitka, cython или numba?

Я вот только, что через nuitka оттранслировал Python код в С-шный файл. 5 строк Python==3000 строк нечитабельного Си кода. Но, правда, это у меня модуль расширения на выходе получился. cython точно также нагенерил 4000 строк.
Как им сказать, чтобы они не модуль расширения на выходе давали, а простой сорец?

---------------------------------
P.S. Nuitka даже exe-шник helloworld'а мне скомпилила. Какая молодец. А вот стоит им (cython или nuitka) дать какой-то код посложнее helloworld и начинается...то такого-то хэдера нет, то сякого...
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
06.04.2020, 06:47
cython. И тоже модуль расширения получился с "клеем" для питона.

Цитата Сообщение от Garry Galler Посмотреть сообщение
Как им сказать, чтобы они не модуль расширения на выходе давали, а простой сорец?
Bash
1
2
cython --embed file.py
gcc -Wall -o exe file.c $(python3-config --cflags) $(python3-config --ldflags) -fPIC
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
$ file exe
exe: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=05bed0ae03f7e2faf6129f644a30c8462c6460b7, with debug_info, not stripped
$ ldd exe 
        linux-vdso.so.1 (0x00007ffccb6ca000)
        libpython3.6m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 (0x00007f0d7c479000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0d7c088000)
        libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f0d7be56000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f0d7bc39000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0d7ba1a000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0d7b816000)
        libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f0d7b613000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0d7b275000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0d7cd2c000)
Lol: NameError: name '__file__' is not defined

А так работает. И вес бинарника не слишком большой, где-то 100-150 КБ. А вот для питона 3.8 код не собрался...
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
06.04.2020, 12:28
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
gcc -Wall -o exe
Я имел ввиду простой Си файл без питоновского клея. Но, я так понимаю, никак его не получишь.

А exe-шник проще через nuitka получать: она сама запускает компилятор имеющийся на машине.
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
И вес бинарника не слишком большой, где-то 100-150 КБ
Это неавтономный бинарь.
Nuitka из helloworld собрала 8 mb, то есть она туда все бинарные зависимости загнала, которые предварительно скопировала:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
\_ssl.pyd
\_tkinter.pyd
\comctl32.dll
\pyexpat.pyd
\python35.dll
\select.pyd
\sqlite3.dll
\tcl86t.dll
\tk86t.dll
\unicodedata.pyd
\vcruntime140.dll
\_bz2.pyd
\_ctypes.pyd
\_decimal.pyd
\_elementtree.pyd
\_hashlib.pyd
\_lzma.pyd
\_msi.pyd
\_multiprocessing.pyd
\_overlapped.pyd
\_socket.pyd
\_sqlite3.pyd
и exe-шник полностью автономный.


А вот собрать простой калькулятор на PyQT5 уже не получилось. Exe-шник запускается, но падает с ошибкой что PyQT5 не инициализирован.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
06.04.2020, 12:49
Цитата Сообщение от Garry Galler Посмотреть сообщение
Это неавтономный бинарь.
Да, не автономный. Динамическая линковка с либами. Думаю, можно собрать статический бинарник, только я не знаю как…

Добавлено через 15 минут
Ладно, собрал:
Bash
1
2
gcc -Wall -o "exe" file.c $(python3-config --cflags) \
  -static -L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu -L/usr/lib -lpython3.6m -lpthread -ldl  -lutil -lm -lc -lz -lexpat
С кучей варнингов, но работает.

Code
1
2
3
4
5
6
$ file exe 
exe: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=b27f20a951802a053be9bd0bf8bcf79759b161eb, with debug_info, not stripped
$ ldd exe
        не является динамическим исполняемым файлом
$ du -h exe
8,3M    exe
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
06.04.2020, 14:15
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Ладно, собрал:
А с PyQT5 так получится? (У меня на винде через cython + msvc\mingw64 практически ничего чутка сложного не собиралось)

С nuitka собрать калькулятор получилось
Code
1
py -3.8 -m nuitka --standalone --plugin-enable=qt-plugins --windows-disable-console "%~1"
, но файл получился неавтономный: calc.exe на 8 Mb + 50 mb QT и Python либ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.04.2020, 14:15
Помогаю со студенческими работами здесь

Перевести код с Python на C#
Здравствуйте. Нашел в интернете (на этом сайте) пример программы по линейном программированию написанную на python. Пытался перевести код...

Перевести код на python
procedure TForm1.Button1Click(Sender: TObject); const k=11; m=18; n=3; var x,d,i,kc:byte; kb:integer; a:set...

Перевести код с Python на Си
from pythonds.basic.stack import Stack def infixToPostfix(infixexpr): prec = {} prec = 3 prec = 3 prec = 2 ...

Перевести код из Python в C++
Доброго времени суток. У меня есть решение к нужной мне задаче, но на языке Python, который я знаю ещё очень плохо. Поэтому прошу перевести...

Перевести код с C++ на Python
Ребят, помогите пожалуйста перевести код с C++ на Python #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru