Сообщить об ошибке.

Исполняемые zip-архивы Python

Модуль zipapp предоставляет инструменты для управления созданием zip-файлов, содержащих код Python, которые могут выполняться непосредственно интерпретатором Python. Модуль обеспечивает как интерфейс командной строки, так и Python API.

Для запуска Python, архив приложения должен быть стандартным zip-файлом, содержащим файл __main__.py, который будет запускаться в качестве точки входа для приложения. Как обычно для любого сценария Python, родительский сценарий, в данном случае файл zip, будет помещен в sys.path, а дополнительные модули могут быть импортированы из файла zip.

Формат zip-файла позволяет добавлять произвольные данные к zip-файлу. Формат исполняемого приложения zip использует эту возможность для добавления к файлу стандартной строки POSIX shebang - #!/path/to/python3.

Формально, формат приложения Python zip представляет собой:

  • Архив приложения содержит необязательную строку shebang, которая содержит символы b'#!'. За ними следует путь к интерпретатору, а затем символ новой строки b'\n'. Интерпретатор может быть любым, приемлемым для обработки кода Python в ОС или средством запуска Python в Windows. Интерпретатор должен быть закодирован в UTF-8 в Windows и в sys.getfilesystemencoding() в POSIX.
  • Стандартные данные для исполняемого архива приложения, генерируются модулем zipfile.
  • Содержимое архива приложения должно включать файл с именем __main__.py, который должен находиться в корне и служит точкой входа для запуска приложения.
  • Данные архива приложения могут быть сжатыми или несжатыми.
  • Если в архиве приложения есть строка shebang, он может иметь установленный исполняемый бит в системах POSIX, что позволяет выполняться напрямую.

Ограничения:

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

  • Если ваше приложение зависит от пакета, который включает расширение языка C, этот пакет не может быть запущен из zip-файла. Это ограничение ОС, так как исполняемый код должен присутствовать в файловой системе, чтобы загрузчик ОС мог его загрузить. В этом случае можно исключить эту зависимость из zip-файла, либо потребовать, чтобы ваши пользователи установили его, либо отправить его вместе с вашим zip-файлом и добавить код в __main__.py, который включит разархивированный каталог с модулем в sys.path. В этом случае необходимо убедиться, что вы поставили соответствующие двоичные файлы для вашей целевой архитектуры и, выбрали правильную версию для добавления в sys.path во время выполнения в зависимости от компьютера пользователя.
  • Если вы отправляете исполняемый файл Windows, как описано выше, вы должны либо убедиться, что у ваших пользователей есть python3.dll в их PATH, что не является поведением установщика по умолчанию, либо необходимо связать свое приложение со встроенным дистрибутивом.

  • Модуль zipapp использует API встраивания Python. Это означает, что в приложении sys.executable будет приложением, а не обычным интерпретатором Python. Код приложения и его зависимости должны быть готовы к этой возможности. Например, если приложение использует многопроцессорный модуль, то приложение должно вызвать [multiprocessing.set_executable()], чтобы модуль знал, где найти стандартный интерпретатор Python.