Как скомпилировать python в linux
Перейти к содержимому

Как скомпилировать python в linux

  • автор:

Как скомпилировать в единый бинарный файл приложение на Python в Linux?

Нашел только этот вопрос Упаковка Python проекта в единый exe файл он про Windows. В питоне есть такие вещи как типо make или cargo build после которых получаешь независимый от библиотек и прочего бинарный файл?

Отслеживать
задан 30 мар 2020 в 0:03
493 4 4 серебряных знака 17 17 бронзовых знаков

В чистом виде не бывает, всё что есть — костыли, просто запаковывающие интерпретатор и библиотеки в один архив, и это не является компиляцией (в Windows то же самое)

30 мар 2020 в 0:14
Pyinstaller, да вообще-то почти любая инструция от винды также сработает
30 мар 2020 в 0:15

а как же очень известный проект типо youtube-dl у которого в релизах находится бинарный файл без всяких зависимостей? или они тоже костыли городят с закапыванием интерпретатора? github.com/ytdl-org/youtube-dl/releases/latest/download/…

30 мар 2020 в 0:27
А в код посмотреть слабо? github.com/ytdl-org/youtube-dl/blob/master/setup.py
30 мар 2020 в 11:32

@Ivan да, у youtube-dl тоже костыли. Если вы скормите этот бинарный файл в unzip, то он найдёт в этом файле архив и распакует оттуда библиотеки. А вот интерпретртора в этом файле нет — он должен быть установлен в систему заранее. Если же вы скачаете виндовый youtube-dl.exe, то там в комплекте будет ещё интерпретатор Python 3.4.4 (в виде dll-файла перед архивом) и в архиве стандартные библиотеки для него. Это всё тоже не компиляция, просто упаковка в самораспаковывающийся архив.

30 мар 2020 в 12:58

0

Сортировка: Сброс на вариант по умолчанию

Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.

  • python
  • linux

Запуск python скрипта в Linux

Python — очень популярный язык программирования для написания различных системных скриптов в Linux. В Windows, там где не хватает возможностей командной оболочки используется PowerShell. В Linux же, когда возможностей Bash не хватает используется язык Python.

На этом языке написано огромное количество системных программ, среди них пакетный менеджер apt, видеоредактор OpenShot, а также множество скриптов, которые вы можете установить с помощью утилиты pip. В этой небольшой статье мы рассмотрим как запустить Python скрипт в Linux с помощью терминала различными способами.

Запуск python скрипта в Linux

Для примера нам понадобится Python скрипт. Чтобы не брать какой-либо из существующих скриптов, давайте напишем свой:

print(«Hello from losst!»)

Для того чтобы запустить скрипт необходимо передать его интерпретатору Python. Для этого просто откройте терминал с помощью сочетания клавиш Ctrl + Alt + T, перейдите в папку со скриптом и выполните:

Если вы хотите, чтобы после выполнения скрипта открылась консоль, в которой можно интерактивно выполнять команды языка Python используйте опцию -i:

python -i script.py

Но как вы могли заметить, при запуске apt или openshot не надо писать слово python. Это намного удобнее. Давайте разберемся как это реализовать. Если вы не хотите указывать интерпретатор в командной строке, его надо указать в самом скрипте. Для этого следует в начало скрипта добавить такую строчку:

Сохраните изменения, а затем сделайте файл скрипта исполняемым с помощью такой команды:

chmod ugo+x script.py

После этого можно запустить скрипт Python просто обращаясь к его файлу:

Если убрать расширение .py и переместить скрипт в каталог, находящийся в переменной PATH, например /usr/bin/, то его можно будет выполнять вот так:

Как видите, запуск команды python Linux выполняется довольно просто и для этого даже есть несколько способов. А каким способом пользуетесь вы? Напишите в комментариях!

Похожие записи

Оцените статью

(7 оценок, среднее: 4,14 из 5)

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Об авторе

Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.

10 комментариев к “Запуск python скрипта в Linux”

Иван Петров
Ещё его можно в бинарник скомпилировать. Ответить

В python не ставится точка с запятой после операторов. Ещё в большинстве дистрибутивов установлены две версии python, 2.7 и 3. Команда python script.py запустит скрипт в версии python 2.7, комнада
python3 script.py в верси 3 Ответить

Привет.
А можно кто-то написать скрипт чтобы автоматизировать подключение к VPN?
Сейчас мне надо в терминале выполнять команды:
cd Folder/Folder
—config file.ovpn
Потом в терминале запрашивается имя пользователя. После успешного ввода запрашивается пароль.
Пока мне не удалось найти решение чтобы запуском скрипта вводились команды, а потом логин и пароль.
Может кто-то подскажет?
Использую Линукс (Федору) 3й день. До этого не сталкивался )
Спасибо. Ответить

Часто используют виртуальные окружения, которые пользователь создает под своим акаунтом.
В этом окружении устанавливаются необходимая версия python (может отличаться от общесистемной) и модули. Когда нужно запустить такой скрипт, в самом начале (указатель на интерпретатор) пишется примерно так:
#!/home//.virtualenvs//bin/python3
что как мне кажется неудобно, особенно если нужно поделиться скриптом с кем-то еще по команде. Поделитесь более интересными способами запуска .py скриптов из виртуальных окружений ? Ответить

Это кому не хватает возможности BASH?? Тому кто его не знает. BASH намного мощнее и удобнее кривого и тормозного пайтона. Единственный недостаток BASH он как и C не для школяров, а для серьёзных дядек. Ответить

Компиляция python кода в exe под Linux

Если на linux машинах python установлен повсеместно, то windows все наоборот. Решил скомпилировать свое приложения в exe, причем желательно что бы это был одинокий exe файл и не тянул с собой дополнительные dll библиотеки.
Для компиляции python кода в бинарные файлы есть очень удобная программа pyinstaller.
Поддержку cross компиляции они уже начали добавлять, но пока она работает не полноценно, поэтому я решил установить python под wine.
Устанавливаем wine. Качаем python.
У меня, кстати, python 2.7.2 отказался устанавливать под wine, а вот 2.7.1 встал без проблем.
Для работы pyinstaller под windows нужен пакет pywin32 , качаем и устанавливаем(http://sourceforge.net/projects/pywin32/.
Качаем pyinstaller(http://www.pyinstaller.org/.
После того как у нас установлен python и pywin32 под wine, мы готовы.
Распаковываем pyinstaller куда-нибудь поближе к установленном python, у меня это было /home/pavel/.wine/drive_c/Python27/progs/pyinstaller-1.5.1
Туда же, в progs, копируем наше python приложение.
Для начала надо что pyintaller создал файл конфигурации для нашей системы

wine python.exe progs/pyinstaller-1.5.1/Configure.py 

Далее создаем spec файл для нашего python приложения

wine python.exe progs/pyinstaller-1.5.1/Makespec.py -F progs/foobar.py 

ключик -F как раз нужен для того чтобы на выходе у нас получился stand-alone executables
Makespec.py сгенерирует файл foobar.spec , который нам необходим для компиляции.
И последнее что осталось сделать, это сбилдить наш бинарник.

wine python.exe progs/pyinstaller-1.5.1/Build.py foobar.spec 

И в директории dist получаем наш foobar.exe .

Компиляция Python

Предположим, вы разработали приложение или библиотеку на Python и уже готовитесь передать его / её заказчику. И в этот момент возникают вопросы, о которых многие даже не задумываются.

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

Во-вторых, возникает вопрос окружения — хочется быть уверенным, что заказчик справится с установкой правильной версии Python и всех вспомогательных библиотек, но это не всегда простая задача. Было бы удобно упаковать приложение в автономный исполняемый файл.

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

И вот тут настало время скомпилировать Python-код. Меня зовут Руслан, я старший разработчик компании «Цифровое проектирование». Сегодня я расскажу, как выбрать тот самый компилятор из множества доступных.

AOT/JIT

Компиляция – это сборка программы, включающая: трансляцию всех модулей программы, написанных на языке программирования высокого уровня, в эквивалентные программные модули на низкоуровневом языке, близком к машинному коду, или на машинном языке и сборку исполняемой программы. Существует два вида компиляции:

  • AOT-компиляция (ahead-of-time) – компиляция перед исполнением программы. Т.е. программа компилируется один раз, в результате компиляции получается исполняемый файл.
  • JIT-компиляция (just-in-time) – компиляция во время исполнения программы. Т.е. программа (а точнее, блоки программы) компилируется много раз — при каждом запуске.

Бенчмарк

Так как одной из целей является ускорение, необходимо оценить, насколько быстро работает скомпилированный код. В качестве бенчмарка будем использовать pyperfomance. К сожалению, pyperfomance не подошел для Cython и Pythran, потому что не позволяет визуализировать все возможности языка. Ускорения для Cython без модификации кода получить не удалось, а Pythran не умеет в пользовательские классы. Для них воспользуемся вычислением числа пи:

def approximate_pi(n): step = 1.0 / n result = 0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result

Эксперименты будем проводить на процессоре Intel Core i7 10510U. На CPython 3.9.7 время вычисления числа пи до 100.000.000 знака заняло 5.82 секунды.

AOT-компиляция Python

PyInstaller

PyInstaller упаковывает приложения Python в автономные исполняемые файлы в Windows, GNU / Linux, Mac OS X, FreeBSD, Solaris и AIX.

Устанавливается через pip:

pip install pyinstaller

После установки для создания исполняемого файла достаточно выполнить команду:

В результате будет создано:

  • *.spec – файл спецификации (используется для ускорения будущих сборок приложения, связи файлов данных с приложением, для включения .dll и .so файлов, добавление в исполняемый файл параметров runtime-а Python);
  • build/ – директория с метаданными для сборки исполняемого файла;
  • dist/ – директория, содержащая все зависимости и исполняемый файл.

Сборку приложения можно настроить с помощью параметров командной строки:

  • —name – изменение имени исполняемого файла (по умолчанию, такое же, как у сценария);
  • —onefile – создание только исполняемого файла (по умолчанию, папка с зависимостями и исполняемый файл);
  • —hidden-import – перечисление импортов, которые PyInstaller не смог обнаружить автоматически;
  • —add-data – добавление в сборку файлов данных;
  • —add-binary – добавление в сборку бинарных файлов;
  • —exclude-module – исключение модулей из исполняемого файла;
  • —key – ключ шифрования AES256. Да, приложение не будет содержать исходного кода, но его можно декомпилировать, например, так: Pyinstaller Extractor (.exe → .pyc) и uncompile6 (.pyc → .py). Для скрытия исходного кода можно обфусцировать байт-код Python с помощью шифрования.

У PyInstaller есть ограничения. Он работает с Python 3.5–3.9. Поддерживает создание исполняемых файлов для разных операционных систем, но не умеет выполнять кросскомпиляцию, т. е. необходимо генерировать исполняемый файл для каждой ОС отдельно. Более того, исполняемый файл зависит от пользовательского glibc, т. е. необходимо генерировать исполняемый файл для самой старой версии каждой ОС.

PyInstaller знает о многих Python-пакетах и умеет их учитывать при сборке исполняемого файла. Но не о всех. Например, фреймворк uvicorn практически весь нужно явно импортировать в файл, к которому будет применена команда pyinstaller. Полный список поддерживаемых из коробки пакетов можно посмотреть здесь.

Cython

Cython — это оптимизирующий статический компилятор как для языка программирования Python, так и для расширенного языка программирования Cython. С его помощью можно код на Python транслировать в С и затем скомпилировать в бинарник, совместимый с CPython. Компиляцию придется делать под все операционные системы и архитектуры процессора.

Ставится Cython через pip:

pip install Cython

Рассмотрим его работу на примере с вычислением числа пи:

def approximate_pi(int n): cdef float step cdef float result cdef float x step = 1.0 / n result = 0.0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result 

А что делать, если в нашем проекте несколько файлов, которые нужно скомпилировать? Тогда нужно использовать так называемый сценарий сборки. С его помощью можно модернизировать сборку в зависимости от операционной системы, указывать несколько файлов, которые необходимо скомпилировать, и многое другое.

Создадим файл build.py:

from distutils.core import setup from Cython.Build import cythonize setup( ext_modules=cythonize("bench_cython.pyx"), ) 

Запустим: python build.py build_ext –-inplace

В результате будет сгенерирован .so/.dll файл.

Nuitka

Nuitka способна упаковывать приложения Python в автономные исполняемые файлы, а также транслировать Python-код в С для его последующей компиляции. Работает с разными версиями Python (2.6, 2.7, 3.3 — 3.9).

Ставится через pip:

pip install nuitka

Для генерации исполняемого файла достаточно выполнить команду:

python -m nuitka —follow-import some_program.py

Для компиляции модуля:

python -m nuitka —module some_module.py

Для компиляции пакета:

python -m nuitka —module some_package —include-package = some_package

Pythran

Pythran – статический компилятор Python, позиционирующий себя как ориентированный на научные вычисления и использующий преимущества многоядерных процессоров и блоков инструкций SIMD. Он транслирует Python-код, аннотированный описаниями интерфейса, в C++. До версии 0.9.5 (включительно) Pythran поддерживал Python 3 и Python 2.7. Последние версии поддерживают только Python 3.

pip install pythran

Генерируем бинарный файл .so:

Pythran по умолчанию не умеет в пользовательские классы, поэтому при попытке их компиляции будет выброшена ошибка:

Top level statements can only be assignments, strings,functions, comments, or imports

Добавим комментарий аннотации функции:

#pythran export approximate_pi(int) def approximate_pi(n): step = 1.0 / n result = 0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result

Скомпилируем и бенчмарк выдает 0,00007 секунды.

cx-Freeze

cx-Freeze – это набор скриптов и модулей преобразования скриптов Python в исполняемые файлы. cx_Freeze — кроссплатформенный. Он поддерживает Python 3.5.2 и выше.

Ставится с помощью pip:

pip install cx_Freeze

Для генерации исполняемого файла достаточно выполнить команду:

Сборку можно настроить с помощью параметров командной строки:

  • -h, —help — справка;
  • -O — оптимизировать сгенерированный байт-код согласно PYTHONOPTIMIZE;
  • -c, —compress — сжать байт-код в zip-файлах;
  • -s, —silent — выводить только предупреждения и ошибки;
  • —target-dir=DIR, —install-dir=DIR — каталог, в который следует поместить целевой файл и все зависимые файлы.

Также возможно использование сценария сборки, например, так:

import sys from cx_Freeze import setup, Executable # Dependencies are automatically detected, but it might need fine tuning. build_exe_options = # GUI applications require a different base on Windows (the default is for a # console application). base = None if sys.platform == "win32": base = "Win32GUI" setup( name = "guifoo", version = "0.1", description = "My GUI application!", options = , executables = [Executable("guifoo.py", base=base)])

Сборка исполняемого файла:

python setup.py build

JIT-компиляция Python

JIT-компиляция не позволяет скрывать исходники или создавать автономный исполняемый файл, но дает возможность значительно ускорить выполнение программы.

PyPy

PyPy — интерпретатор языка программирования Python 2.7 и Python 3.7. Он написан на RPython и содержит:

  • компилятор байт-кода, отвечающий за создание объектов кода Python из исходного кода пользовательского приложения;
  • оценщик байт-кода, ответственный за интерпретацию объектов кода Python;
  • стандартное объектное пространство, отвечающее за создание и управление объектами Python, видимыми приложением.

PyPy поддерживает сотни библиотек Python, включая NumPy.

Основные особенности (сравнение с CPython):

  • Скорость. При выполнении длительно выполняющихся программ, когда значительная часть времени тратится на выполнение кода Python, PyPy может значительно ускорить ваш код.
  • Использование памяти. Программы Python, требующие много памяти (несколько сотен Мб или более), могут занимать меньше места, чем в CPython. Однако это не всегда так, поскольку зависит от множества деталей. Также базовый уровень потребления оперативной памяти выше, чем у CPython.

Скачать PyPy можно с здесь. После скачивания PyPy готов к запуску после распаковки архива. Если необходимо сделать PyPy доступным для всей системы, достаточно поместить символическую ссылку на исполняемый файл pypy в /usr/local/bin. Также можно поставить с помощью pyenv.

PyPy работает на Mac, Linux (не все дистрибутивы) или Windows.

Для запуска кода с помощью PyPy вместо команды python3 (как c помощью CPython) достаточно воспользоваться командой pypy3:

Pyston

Pyston — это форк CPython 3.8.8 с дополнительной оптимизацией производительности. В настоящее время он поддерживает установку только из исходников. Или с помощью pyenv.

В Pyston поддерживаются все возможности CPython, в том числе C API для разработки расширений на языке Си. Среди основных отличий Pyston от CPython помимо общих оптимизаций выделяется использование DynASM JIT и inline-кэширования.

Заключение

Итак, мы рассмотрели 5 фреймворков AOT-компиляции Python. Для любителей аналитики, ниже приведена таблица со сравнительным анализом.

PyInstaller

Cython

Nuitka

Pythran

cx-Freeze

Генерация автономных исполняемых файлов

Компиляция python-модуля в исполняемый файл, совместимый с CPython

Добавить комментарий

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