Для тех, кому интересно, Роб МакКуин (Rob McQueen) разместил свои мысли о развертывании серверных приложений при работе в ОС Debian ( https://nylas.com/blog/packaging-deploying-python).
Мало кто знает, что Python может выполнять ZIP-файлы, содержащие файл __main__.py, начиная с версии 2.6. Это отличный способ упаковки приложений, написанных на чистом Python (приложений, которым не нужны бинарные файлы для указанных платформ). Поэтому, если у вас есть отдельный файл __main__.py примерно такого содержания:
if __name__ == '__main__':
····try:
········print 'ping!'
····except SyntaxError: # Python 3
········print('ping!')
и вы создаете ZIP-файл, содержащий его, введите следующую команду:
$ zip machine.zip __main__.py
Вы сможете отправить этот ZIP-файл другим пользователям; и, если у них установлен Python, они могут выполнить его в командной строке следующим образом:
$ python machine.zip
ping!
Если хотите создать исполняемый файл, можете добавить в начало ZIP-файла POSIX символы #! (называется shebang — «шебанг») — формат ZIP это позволяет, — и у вас получится независимое приложение (если Python доступен по пути, указанном с помощью последовательности символов #!). Рассмотрим пример, который продолжает предыдущий код:
$ echo '#!/usr/bin/env python' > machine
$ cat machine.zip >> machine
$ chmod u+x machine
А теперь его исполняемый файл:
$./machine
ping!

Начиная с Python 3.5 в стандартной библиотеке существует модуль zipapp ( https://docs.python.org/3/library/zipapp.html), который позволяет создавать ZIP-файлы более удобным способом. Он также добавляет гибкости, поэтому основной файл не должен обязательно называться __main__.py.
Если вы используете сторонние зависимости, размещая их в текущем каталоге, и изменяете оператор импорта, можете создать исполняемый ZIP-файл, который будет содержать все зависимости. Если структура каталогов выглядит так:
.
|- archive/
···· |- __main__.py
и вы работаете в виртуальной среде, где установлены только необходимые вам зависимости, вы можете ввести следующие команды в оболочке, чтобы включить ваши зависимости:
$ cd archive
$ pip freeze | xargs pip install — target=packages
$ touch packages/__init__.py
Команда xargs принимает стандартный вывод от pip freeze и превращает его в список аргументов команды pip, флаг — target=packages отправляет установку в новый каталог packages. Команда touch создает пустой файл, если таких не существует. В противном случае обновляет временную метку, устанавливая ее значение равным текущему времени. Структура каталога будет выглядеть так:
.
|- archive/
···· |- __main__.py
···· |- packages/
········· |- __init__.py
········· |- dependency_one/
········· |- dependency_two/
Убедитесь, что вы изменяете оператор импорта для использования каталога packages, который только что создали:
#импортируем dependency_one # не эту
import packages.dependency_one as dependency_one
А затем рекурсивно включите все каталоги в новый ZIP-файл с помощью команды zip — r, например так:
$ cd archive
$ zip machine.zip — r *
$ echo '#!/usr/bin/env python' > machine
$ cat machine.zip >> machine
$ chmod ug+x machine
Часть III. Руководство по сценариям
К этому моменту вы уже установили Python, выбрали редактор, знаете значение слова «питонский», прочитали несколько строк отличного кода Python и можете поделиться собственным кодом с остальным миром. Эта часть руководства поможет вам выбрать библиотеки для вашего продукта независимо от того, что вы решите реализовать. Мы поделимся наиболее распространенными подходами сообщества к определенным сценариям, они сгруппированы по принципу подобия.
• Глава 7 «Взаимодействие с пользователем». Мы рассмотрим библиотеки для всех типов взаимодействия с пользователем — от консольных приложений до графических и веб-приложений.
• Глава 8 «Управление кодом и его улучшение». Мы опишем инструменты для системного администрирования, взаимодействия с библиотеками, написанными на C и C++, а также перечислим способы повысить скорость работы Python.
• Глава 9 «Программные интерфейсы». Мы рассмотрим библиотеки, используемые для работы с сетью, включая асинхронные, а также библиотеки для сериализации и шифрования.
• Глава 10 «Манипуляции с данными». Мы рассмотрим библиотеки, которые предоставляют символьные и численные алгоритмы, графики, а также инструменты для обработки изображений и аудио.
Читать дальше