С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 20.03.2020
Сообщений: 23

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

04.04.2020, 13:55. Показов 3460. Ответов 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
 Аватар для Рыжий Лис
5972 / 3734 / 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,753
05.04.2020, 21:15
Можно написать конвертер. Инструкция в книге авторов Уэйт, Прата, Мартин "Язык Си" 1988 год, страница 78 (в бумажной книге). Если надо будет найти это место в электронной, могу посмотреть ключевую фразу для поиска.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 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
 Аватар для Рыжий Лис
5972 / 3734 / 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
 Аватар для Рыжий Лис
5972 / 3734 / 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
 Аватар для Рыжий Лис
5972 / 3734 / 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru