#37 Как сделать python-скрипт исполняемым в различных операционных системах?

(вторая часть)

У нас может быть мультиплатформенный или моноплатформенный скрипт/программа/утилита/что-угодно, и мы хотим его распространять среди пользователей, не знающих, что такое Python, не имеющих на своей машине нужных пакетов и модулей.

Вариант номер 1: А давайте напишем dockerfile, соберем docker-контейнер, и тогда скрипт можно будет запускать под разными операционнами системами, включая Windows. Рабочий вариант, при условии, что наша программа - это некий web-based сервис и весь его интерфейс реализован в виде web-странички, либо не имеет даже его, а выполняет какую-нибудь сетевую функцию или является хранилищем. Всё, что ему необходимо иметь, он носит с собой и значительно изолирован от операцонной системы пользователя, что может быть для разных задач как плюсом, так и минусом.

Вариант номер 2: А давайте соберем исполняемый файл для целевой операционной системы. Используем PyInstaller, утилиту для этих целей. Она создаст исполняемый файл или папку с файлами, содержащими нужные модули. В случае упаковки в один файл - да-да, я говорю "упаковки" - по сути будет создан самораспаковывающийся архив, создающий при запуске нужное окружение и исполняющий байт-код нашей программы. Это будет полноценная программа, с доступом к файловой системе, портам, графическому интерфейсу. Можно открывать диалоговые окна и грабить коро.... Эм, нет, только окна.

Минусы - иногда PyInstaller может упаковать слишком много ненужного, иногда не включить нужный модуль, и самое главное - в любом случае это будет байткод.

Вариант номер 2+: А давайте используем Nuitka. Транспилируем Python-код в C, и потом соберем его при помощи cmake как программу, написанную на C.

Это будет уже не байткод, и производительность в некоторых случаях будет чуть выше, но кардинальным образом не изменится. Метод симпатичный, вот только не всегда получается собрать исполняемый файл так, чтобы он потом без проблем запустился. К сожалению, единого стандартного "компилятора" для Python нет.

По умолчанию я стараюсь использовать PyInstaller из-за лучшей поддержки и минимума головной боли. Если, конечно, задача собрать программу в исполняемый файл у меня имеется.


Это кросспост из моего Telegram-канала "Не Ван Россум", где я прямо сейчас пишу сериал "101 вопрос про Python" с описанием подводных камней, неочевидностей и загвоздок.

#сериал101, #37