You are currently viewing Zipapp Python: Создание исполняемых Zip-Приложений

Zipapp Python: Создание исполняемых Zip-Приложений

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

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

В этом уроке вы узнаете:

  • Что такое Zip-приложение на Python
  • Как приложения Zip работают внутри
  • Как создавать Zip-приложения на Python с помощью zipapp
  • Что такое автономные Zip-приложения на Python и как их создавать
  • Как создавать Zip-приложения Python вручную с помощью инструментов командной строки

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

Чтобы лучше понять этот учебник, вам необходимо знать, как структурировать макеты приложений Python, запускать сценарии Python, создавать пакеты Python, работать с виртуальными средами Python, а также устанавливать зависимости и управлять pip ими . Вам также должно быть удобно пользоваться командной строкой или терминалом.

Бесплатный бонус: Нажмите здесь, чтобы получить шпаргалку по Python и изучить основы Python 3, такие как работа с типами данных, словарями, списками и функциями Python.

Начало работы с Zip-приложениями Python

Одной из наиболее сложных проблем в экосистеме Python является поиск эффективного способа распространения исполняемых приложений, таких как программы с графическим пользовательским интерфейсом (GUI) и интерфейсом командной строки (CLI).

Скомпилированные языки программирования, такие как C, C++ и Go, могут генерировать исполняемые файлы, которые можно запускать непосредственно в различных операционных системах и архитектурах. Эта возможность позволяет вам легко распространять программное обеспечение среди конечных пользователей.

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

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

Иногда вам не нужна такая дополнительная сложность. Вам просто нужно создать исполняемое приложение из сценария или небольшой программы, чтобы вы могли быстро распространить его среди конечных пользователей. Если ваше приложение достаточно маленькое и использует чистый код Python, то вам может быть удобно работать с почтовым приложением Python.

Что такое Zip-приложение на Python?

PEP 441 – Улучшение поддержки ZIP-приложений на Python формализовало идею, терминологию и спецификацию приложений на Python Zip. Этот тип приложения состоит из одного файла, который использует формат ZIP-файла и содержит код, который Python может выполнять как программу. Эти приложения полагаются на способность Python запускать код из ZIP-файлов__main__.py, в корне которых находится модуль, который работает как скрипт точки входа.

Python может запускать сценарии из ZIP — файлов начиная с версий 2.6 и 3.0. Шаги для достижения этой цели довольно просты. Вам просто нужен ZIP-файл с __main__.py модулем в корне. Затем вы можете передать этот файл в Python, который добавляет его sys.path и выполняет __main__.py как программу. Наличие архива приложения sys.path позволяет вам получить доступ к его коду через систему импорта Python.

В качестве краткого примера того, как все это работает, предположим, что вы используете операционную систему, подобную Unix, такую как Linux или macOS, и выполняете следующие команды:

$ echo 'print("Hello, World!")' > __main__.py

$ zip hello.zip __main__.py
  adding: __main__.py (stored 0%)

$ python ./hello.zip
Hello, World!

Вы используете echo команду для создания __main__.py файла, содержащего код print("Hello, World!"). Затем вы используете zip команду для архивирования __main__.py в hello.zip. Как только вы это сделаете, вы сможете работать hello.zip как программа, передав имя файла в качестве аргумента python команде.

Чтобы округлить внутреннюю структуру Zip-приложений Python, вам нужен способ сообщить операционной системе, как их выполнять. Формат ZIP-файла позволяет добавлять произвольные данные в начале ZIP-архива. Zip-приложения Python используют эту функцию, чтобы включить стандартную строку Unix shebang в архив приложения:

#!/usr/bin/env python3

В системах Unix эта строка указывает операционной системе, какую программу использовать для выполнения текущего файла, чтобы вы могли запустить файл напрямую без python команды. В системах Windows программа запуска Python правильно понимает строку shebang и запускает приложение Zip для вас.

Даже с помощью строки shebang вы всегда можете выполнить Zip-приложение Python, передав имя файла приложения в качестве аргумента python команде.

Таким образом, для создания Zip-приложения на Python вам необходимо:

  • Архив, который использует стандартный формат ZIP-файла и содержит __main__.py модуль в своем корне
  • Необязательная строка shebang, указывающая соответствующий интерпретатор Python для запуска приложения

Помимо __main__.py модуля, ZIP-файл вашего приложения может содержать модули и пакеты Python, а также любые другие произвольные файлы. Однако только .py файлы,.pyc, и .pyo доступны для прямого использования через систему импорта. Другими словами, вы можете упаковать .pyd.so, и .dll файлы в файл вашего приложения, но вы не сможете их использовать, если не распакуете их в свою файловую систему.

Примечание: Невозможность выполнения кода из .pyd.so, и .dll файлов, хранящихся в ZIP-файле, является ограничением операционной системы. Это ограничение затрудняет создание Zip-приложений, которые отправляют и используют .pyd.so файлы,.dll, и.

Экосистема Python полна полезных библиотек и инструментов, написанных на C или C++, чтобы гарантировать скорость и эффективность. Даже если вы можете объединить любую из этих библиотек в архив Zip-приложения, вы не сможете использовать их непосредственно оттуда. Вам нужно будет распаковать библиотеку в свою файловую систему, а затем получить доступ к ее компонентам из этого нового расположения.

PEP 441 предлагается .pyz и .pyzw в качестве расширений файлов для приложений Python Zip.pyz Расширение идентифицирует консольные приложения или приложения командной строки, в то время .pyzw как расширение относится к оконным приложениям или приложениям с графическим интерфейсом.

В системах Unix вы можете удалить .pyz расширение, если предпочитаете простое имя команды для приложений CLI. В Windows файлы .pyz и .pyzw являются исполняемыми файлами, поскольку интерпретатор Python регистрирует их как таковые.

Зачем использовать Zip-приложения на Python?

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

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

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

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

Как создать Zip-приложение на Python?

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

Чтобы создать Zip-приложение на Python, вы можете выполнить следующие общие действия:

  1. Создайте исходный каталог приложения, содержащий __main__.py модуль.
  2. Заархивируйте исходный каталог приложения.
  3. Добавьте необязательную строку shebang Unix, чтобы определить интерпретатор для запуска приложения.
  4. Сделайте ZIP-файл приложения исполняемым. Этот шаг применим только к Unix-подобным операционным системам.

Эти шаги довольно просты и быстры в выполнении. С их помощью вы можете создать Zip-приложение на Python вручную за пару минут, если у вас есть необходимые инструменты и знания. Однако стандартная библиотека Python включает в себя более удобное и быстрое решение для вас.

PEP 441 предложил добавить новый модуль, называемый zipapp стандартной библиотекой. Этот модуль облегчает создание Zip-приложений и доступен с Python 3.5.

В этом уроке вы сосредоточитесь на создании Zip-приложений на Python с использованием zipapp. Однако вы также узнаете, как выполнить весь ряд шагов вручную, используя различные инструменты. Эти дополнительные знания могут помочь вам более глубоко понять весь процесс создания Zip-приложений на Python. Это также будет полезно, если вы используете версию Python ниже 3.5.

Настройка Zip-приложения на Python

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

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

Чтобы продолжить, вам следует клонировать репозиторий reader на локальную машину. Откройте командную строку в рабочем каталоге по вашему выбору и выполните следующую команду:

$ git clone https://github.com/realpython/reader.git

Эта команда загружает полное содержимое reader репозитория в reader/ папку в вашем текущем каталоге.

Примечание: Ознакомьтесь с введением в Git и GitHub для разработчиков Python, если вы не знакомы с Git и GitHub.

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

$ cd reader/
$ python3 -m venv ./venv
$ source venv/bin/activate

Эти команды создают и активируют новую виртуальную среду Python в reader/ каталоге, который является корневым каталогом reader проекта.

Примечание. Чтобы создать и активировать виртуальную среду в Windows, вы можете выполнить следующие команды:

C:\> python -m venv venv
C:\> venv\Scripts\activate.bat

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

Теперь вы можете установить зависимости от reader использования pip:

(venv) $ python -m pip install feedparser html2text importlib_resources

Выполнение приведенной выше команды приведет к установке всех зависимостей приложения в вашей активной виртуальной среде Python.

Примечание: Начиная с Python 3.7, importlib_resources доступен в стандартной библиотеке как importlib.resources. Поэтому, если вы используете версию, превышающую или равную 3.7, вам не нужно устанавливать эту библиотеку. Просто измените соответствующий импорт в __init__.py файле, определяющем reader пакет.

(venv) $ python -m reader
The latest tutorials from Real Python (https://programbox.ru/)
  0 The Django Template Language: Tags and Filters
  1 Pass by Reference in Python: Best Practices
  2 Using the "and" Boolean Operator in Python
    ...

Этот вывод будет отличаться для вас, так reader как в нем перечислены тридцать последних учебных ресурсов в ленте. Каждый учебный ресурс имеет идентификационный номер. Чтобы получить содержимое одного элемента из этих учебных ресурсов, вы можете передать соответствующий идентификационный номер в качестве аргумента командной строки в reader:

(venv) $ python -m reader 2
Using the "and" Boolean Operator in Python

Python has three Boolean operators, or **logical operators** : `and`, `or`,
and `not`. You can use them to check if certain conditions are met before
deciding the execution path your programs will follow. In this tutorial,
you'll learn about the `and` operator and how to use it in your code.
    ...

Эта команда выводит часть содержимого статьи с помощью логического оператора “и” в Python на ваш экран в текстовом формате Markdown. Вы можете прочитать любую из доступных частей контента, изменив идентификационный номер.

Примечание: Детали того, как reader это работает, не имеют отношения к этому учебнику. Если вас интересует реализация, ознакомьтесь с тем, как опубликовать пакет Python с открытым исходным кодом в PyPI. 

Для создания Zip-приложения из reader репозитория вы в основном будете использовать reader/ папку. Эта папка имеет следующую структуру:

reader/
|
├── config.cfg
├── feed.py
├── __init__.py
├── __main__.py
└── viewer.py

Наиболее важным фактом, который следует отметить в reader/ каталоге, является то, что он содержит __main__.py файл. Этот файл позволяет вам выполнить пакет с помощью python -m readerкоманды, как вы делали это раньше.

Наличие __main__.py файла обеспечивает необходимый сценарий точки входа для создания Zip-приложения на Python. В этом примере __main__.py файл находится внутри reader пакета. Если вы создадите приложение Zip с использованием этой структуры каталогов, то ваше приложение не будет запущено, поскольку __main__.py не сможет импортировать объекты из reader.

Чтобы обойти это, скопируйте reader пакет во внешний каталог с именем realpython/ и поместите __main__.py файл в его корневой каталог. Затем удалите __pycache__/ папку , которая является результатом выполнения python -m reader, как вы делали раньше. В итоге вы должны получить следующую структуру каталогов:

realpython/
│
├── reader/
│   ├── __init__.py
│   ├── config.cfg
│   ├── feed.py
│   └── viewer.py
│
└── __main__.py

С этой новой структурой каталогов вы готовы создать свое первое Zip-приложение на Python zipapp. Это то, что вы будете делать в следующем разделе.

Создание Zip-приложения на Python с помощью zipapp

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

В следующих двух разделах вы узнаете об обоих подходах к созданию Zip-приложений с использованием zipapp.

Использование zipapp из командной строки

Интерфейс командной строки zipapp упрощает процесс упаковки приложений Python в ZIP-файлы. Внутренне zipapp создайте Zip-приложение из исходного кода, выполнив действия, которые вы изучили ранее.

Для запуска zipapp из командной строки следует использовать следующий синтаксис команды:

$ python -m zipapp <source> [OPTIONS]

Если source это каталог, то эта команда создает Zip-приложение из содержимого этого каталога. Если source это файл, то этот файл должен быть ZIP-файлом, содержащим код приложения. Содержимое входного ZIP-файла затем копируется в архив целевого приложения.

Вот краткое описание параметров командной строки, которые zipapp принимают:

ОпцииОписание
-o <output_filename> или --output=<output_filename>Записывает Zip — приложение в файл с именем output_filename. Этот параметр использует выходное имя файла, как вы его указали. Если вы не предоставляете эту опцию, то zipapp используйте имя sourceс .pyz расширением.
-p <interpreter> или --python=<interpreter>Добавляет строку shebang в архив приложения. Если вы используете систему POSIX, то zipapp делает архив приложения исполняемым. Если вы не предоставите эту опцию, то архив вашего приложения не будет иметь проблем и не будет исполняемым.
-m <main_function> или --main=<main_function>Создает и записывает соответствующий __main__.py файл, который выполняется main_functionmain_function Аргумент должен иметь форму "package.module:callable". Вам не нужна эта опция, если у вас уже есть __main__.py модуль.
-c или --compressСжимает содержимое sourceс помощью метода сжатия выкачки. По умолчанию zipappпросто сохраняет содержимое sourceбез его сжатия, что может ускорить работу вашего приложения.

В этой таблице содержится минимальное описание параметров командной строки для zipapp. Для получения более подробной информации о конкретном поведении каждого варианта ознакомьтесь с официальной документацией.

Теперь, когда вы знаете основы использования zipapp из командной строки, пришло время создать приложение reader Zip. Вернитесь в окно терминала и выполните следующую команду:

(venv) $ python -m zipapp realpython/ \
-o realpython.pyz \
-p "/usr/bin/env python3"

В этой команде вы задаете realpython/ каталог в качестве источника для своего приложения Zip. С помощью этой -o опции вы указываете имя архива приложения, realpython.pyz. Наконец, -p опция позволяет вам установить интерпретатор, который zipapp будет использоваться для построения строки shebang.

Вот и все! Теперь у вас будет realpython.pyz файл в вашем текущем каталоге. Вы узнаете, как выполнить этот файл через мгновение.

Чтобы продемонстрировать параметры -m--main командной строки zipapp и , скажем, вы решили изменить макет reader проекта и переименовать __main__.pycli.py его, перемещая файл обратно в reader пакет. Продолжайте, создайте копию своего realpython/ каталога и внесите предложенные изменения. После этого копия realpython/ должна выглядеть следующим образом:

realpython_copy/
│
└── reader/
    ├── __init__.py
    ├── cli.py
    ├── config.cfg
    ├── feed.py
    └── viewer.py

На данный момент в исходном каталоге вашего приложения нет __main__.py модуля. Опция -m командной строки zipapp позволяет автоматически генерировать его:

$ python -m zipapp realpython_copy/ \
-o realpython.pyz \
-p "/usr/bin/env python3" \
-m "reader.cli:main"

Эта команда принимает -m параметр with "reader.cli:main"в качестве аргумента. Это входное значение указывает zipapp, что точка входа, вызываемая для приложения Zip, находится main() в cli.py модуле reader пакета.

Полученный __main__.py файл содержит следующее содержимое:

# -*- coding: utf-8 -*-
import reader.cli
reader.cli.main()

Этот __main__.py файл затем упаковывается вместе с исходным кодом вашего приложения в ZIP-архив с именем realpython.pyz.

Использование zipapp кода из Python

Python zipapp также имеет интерфейс прикладного программирования (API), который вы можете использовать из своего кода Python. Этот API в основном состоит из вызываемой функции create_archive(). С помощью этой функции вы можете быстро создать Zip-приложение на Python:>>>

>>> import zipapp

>>> zipapp.create_archive(
...     source="realpython/",
...     target="realpython.pyz",
...     interpreter="/usr/bin/env python3",
... )

Этот вызов create_archive() принимает первый вызванный аргумент source, представляющий источник вашего Zip-приложения. Второй аргумент, target, содержит имя файла архива приложения. Наконец, interpreter содержит интерпретатор для сборки и добавления в качестве строки shebang в ZIP-архив приложения.

Вот краткое изложение аргументов, которые create_archive()могут принять:

  • source можно взять следующие объекты:
    • Строковый путь к существующему исходному каталогу
    • Объект, подобный пути, ссылающийся на существующий исходный каталог
    • Строковый путь к существующему архиву Zip-приложений
    • Объект, подобный пути, ссылающийся на существующий архив Zip-приложения
    • Файло-подобный объект, открытый для чтения и указывающий на существующий архив Zip-приложения
  • target принимает следующие объекты:
    • Строковый путь к целевому файлу Zip-приложения
    • Объект, подобный пути,к целевому файлу Zip-приложения
  • interpreter указывает интерпретатор Python, который записывается в виде строки shebang в начале результирующего архива приложений. Пропуск этого аргумента приводит к отсутствию строки shebang и отсутствию разрешения на выполнение для приложения.
  • main указывает имя вызываемого объекта, который zipapp будет использоваться в качестве точки входа для целевого архива. Вы указываете значение main, когда у вас нет __main__.py файла.
  • filter принимает логически значимую функцию, которая должна возвращать значение True, если данный файл в исходном каталоге должен быть добавлен в конечный файл приложения Zip.
  • compressed принимает логическое значение, определяющее, хотите ли вы сжимать исходные файлы или нет.

Большинство из этих аргументов имеют эквивалентную опцию в интерфейсе командной строки zipapp. В приведенном выше примере используются только первые три аргумента. В зависимости от ваших конкретных потребностей вы можете использовать и другие аргументы.

Запуск Zip-приложения на Python

До сих пор вы научились создавать Zip-приложения на Python, используя zipapp командную строку и код Python. Теперь пришло время запустить ваше realpython.pyz приложение, чтобы убедиться, что оно работает.

Если вы используете Unix-подобную систему, то вы можете запустить свое приложение, выполнив следующие действия:

(venv) $ ./realpython.pyz
The latest tutorials from Real Python (https://programbox.ru/)
  0 The Django Template Language: Tags and Filters
  1 Pass by Reference in Python: Best Practices
  2 Using the "and" Boolean Operator in Python
    ...

Круто! Это работает! Теперь у вас есть один файл приложения, которым вы можете быстро поделиться с друзьями и коллегами.

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

Примечание. Для запуска приложения в среде Python необходимо установить все необходимые зависимости. В противном случае вы получите ImportError.

Если вы работаете в Windows, то ваша установка Python должна иметь зарегистрированные .pyz файлы и .pyzw файлы и должна иметь возможность их запускать:

C:\> .\realpython.pyz
The latest tutorials from Real Python (https://programbox.ru/)
  0 The Django Template Language: Tags and Filters
  1 Pass by Reference in Python: Best Practices
  2 Using the "and" Boolean Operator in Python
    ...

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

Опять же, вы можете выполнить любое приложение Zip, вызвав соответствующий интерпретатор Python с именем файла приложения в качестве аргумента:

$ python3 realpython.pyz
The latest tutorials from Real Python (https://programbox.ru/)
  0 The Django Template Language: Tags and Filters
  1 Pass by Reference in Python: Best Practices
  2 Using the "and" Boolean Operator in Python
    ...

В этом примере для запуска используется системная установка Python 3.x realpython.pyz. Если в вашей системе много версий Python, вам, возможно, потребуется быть более конкретным и использовать такую команду, как python3.9 realpython.pyz.

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

Создание автономного Zip-приложения на Python c zipapp

Вы также можете использовать zipapp для создания автономных или автономных Zip-приложений на Python. Этот тип приложений объединяет все свои зависимости в ZIP-файл приложения. Таким образом, вашим конечным пользователям нужен только подходящий интерпретатор Python для запуска приложения. Им не нужно беспокоиться о зависимостях.

Чтобы создать автономное Zip-приложение Python, сначала необходимо установить его зависимости в исходный каталог с помощью pip. Продолжайте и создайте копию своего realpython/ каталога с указанным именем realpython_sa/.  Затем выполните следующую команду, чтобы установить зависимости приложения:

(venv) $ python -m pip install feedparser html2text importlib_resources \
--target realpython_sa/

Эта команда устанавливает все зависимости от reader использования pip installс --target опцией. В документации pip говорится, что эта опция позволяет устанавливать пакеты в целевой каталог. В этом примере этот каталог должен быть исходным каталогом вашего приложения, realpython_sa/.

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

Вместо этого вы можете выполнить следующую команду:

(venv) $ python -m pip install \
-r requirements.txt \
--target app_directory/

С помощью этой команды вы устанавливаете все зависимости, перечисленные в файле приложения requirements.txt, в app_directory/ папку.

После установки зависимостей reader into realpython_sa/вы можете при необходимости удалить *.dist-infopip созданные каталоги. Эти каталоги содержат несколько файлов с метаданными, которые pip используются для управления соответствующим пакетом. Поскольку вам больше не нужна эта информация, вы можете избавиться от нее.

Последним шагом в этом процессе является создание Zip-приложения с использованием zipapp обычного:

(venv) $ python -m zipapp realpython_sa/ \
-p "/usr/bin/env python3" \
-o realpython_sa.pyz \
-c

Эта команда создает автономное Zip-приложение на Python realpython_sa.pyz. Чтобы запустить это приложение, вашим конечным пользователям просто нужно иметь на своем компьютере соответствующий интерпретатор Python 3. Преимущество такого приложения по сравнению с обычным Zip-приложением заключается в том, что конечным пользователям не нужно устанавливать какие-либо зависимости для запуска приложения. Идите вперед и попробуйте!

В приведенном выше примере вы используете -cопцию zipapp сжатия содержимого realpython_sa/.  Эта опция может быть довольно удобной для приложений со многими зависимостями, которые занимают значительный объем дискового пространства.

Создание почтового приложения Python Вручную

Как вы уже узнали, zipapp он доступен в стандартной библиотеке с Python 3.5. Если вы используете версию Python ниже этой, вы все равно можете создавать свои Zip-приложения Python вручную без необходимости zipapp.

В следующих двух разделах вы узнаете, как создать Zip-приложение, используя zipfile стандартную библиотеку Python. Вы также узнаете, как использовать некоторые инструменты командной строки для выполнения той же задачи.

Используя Python zipfile

У вас уже есть realpython/ каталог с reader исходными файлами приложения. Следующим шагом для ручной сборки Zip-приложения Python из этого каталога является его архивирование в ZIP-файл. Для этого вы можете использовать zipfile. Этот модуль предоставляет удобные инструменты для создания, чтения, записи, добавления и перечисления содержимого ZIP-файлов.

В приведенном ниже коде показано, как создать приложение reader Zip с помощью zipfile.ZipFile и нескольких других инструментов. Например, код полагается на pathlib и stat для чтения содержимого исходного каталога и установки разрешения на выполнение для результирующего файла:

# build_app.py

import pathlib
import stat
import zipfile

app_source = pathlib.Path("realpython/")
app_filename = pathlib.Path("realpython.pyz")

with open(app_filename, "wb") as app_file:
    # 1. Prepend a shebang line
    shebang_line = b"#!/usr/bin/env python3\n"
    app_file.write(shebang_line)

    # 2. Zip the app's source
    with zipfile.ZipFile(app_file, "w") as zip_app:
        for file in app_source.rglob("*"):
            member_file = file.relative_to(app_source)
            zip_app.write(file, member_file)

# 3. Make the app executable (POSIX systems only)
current_mode = app_filename.stat().st_mode
exec_mode = stat.S_IEXEC
app_filename.chmod(current_mode | exec_mode)

Этот код выполняет три необходимых шага, чтобы в итоге получить полноценное Zip-приложение на Python. На первом шаге в файл приложения добавляется строка shebang. Он использует open()в with инструкции для создания объекта file (app_file) для обработки приложения. Затем он вызывает.write(), чтобы написать строку shebang в начале app_file.

Примечание: Вы должны закодировать строку shebang в UTF-8, если вы работаете в Windows. Если вы используете систему POSIX, такую как Linux и macOS, вы должны закодировать ее в любой кодировке файловой sys.getfilesystemencoding() системы, которая возвращается.

Второй шаг сжимает содержимое исходного каталога приложения, используя ZipFile вложенную with инструкцию. for Цикл повторяет realpython/ используемые файлы pathlib.Path.rglob()и записывает их в zip_app. Обратите внимание, что .rglob() поиск файлов и каталогов рекурсивно выполняется через целевую папку,app_source.

Имя файла member_file, каждого файла в конечном ZIP-архиве должно быть относительно исходного каталога приложения , чтобы гарантировать, что внутренняя структура ZIP-файла приложения соответствует структуре исходного realpython/файла . Вот почему вы используете pathlib.Path.relative_to()в приведенном выше примере.

Наконец, третий шаг делает файл приложения исполняемым с помощью pathlib.Path.chmod().  Для этого вы сначала получаете текущий режим использования файла pathlib.Path.stat(), а затем объединяете этот режим с stat.S_IEXEC использованием побитового оператора ИЛИ (|). Обратите внимание, что этот шаг влияет только на системы POSIX.

После выполнения этих действий ваше realpython.pyz приложение готово к работе. Продолжайте и попробуйте сделать это из командной строки.

Использование Инструментов Командной Строки Unix

Если вы работаете в системе, подобной Unix, такой как Linux и macOS, то вы также можете выполнить три шага из предыдущего раздела, используя специальные инструменты из командной строки. Например, вы можете использовать zip команду для архивирования содержимого исходного каталога приложения:

$ cd realpython/
$ zip -r ../realpython.zip *

В этом примере вы сначала cd попадаете в realpython/ каталог. Затем вы заархивируете содержимое realpython/в realpython.zip с помощью zip команды с -r опцией. Этот параметр рекурсивно пересекает целевой каталог.

Примечание: Другим вариантом было бы использовать Python zipfile из командной строки.

Для этого выполните следующую команду из-за пределов realpython/ каталога:

$ python -m zipfile --create realpython.zip realpython/*

Опция --create командной строки zipfile позволяет создавать ZIP-файл из исходного каталога. Звездочка (*), добавленная к realpython/ каталогу, указывает zipfile поместить содержимое этого каталога в корень результирующего ZIP-файла.

Следующий шаг-добавить строку shebang в ZIP-файл realpython.zip и сохранить ее как realpython.pyz. С этой целью вы можете использовать команды echo и cat в канале:

$ cd ..
$ echo '#!/usr/bin/env python3' | cat - realpython.zip > realpython.pyz

cd .. Команда выведет вас обратно realpython/echo Команда отправляется '#!/usr/bin/env python3' на стандартный вывод. Символ канала (|) передает содержимое стандартного вывода cat команде. Затем cat объединяет стандартный вывод (-) с содержимым realpython.zip. Наконец, знак больше, чем (>) перенаправляет cat вывод в realpython.pyz файл.

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

$ chmod +x realpython.pyz

Здесь chmod добавляется разрешение на выполнение (+x)realpython.pyz. Теперь вы готовы снова запустить свое приложение, что вы можете сделать из командной строки, как обычно.

Использование сторонних инструментов для создания приложений на Python

В экосистеме Python вы найдете несколько сторонних библиотек, которые работают аналогично zipapp. Они предоставляют гораздо больше возможностей и могут быть полезны для изучения. В этом разделе вы узнаете о двух из этих сторонних библиотек: pex и shiv.

pex Проект предоставляет инструмент для создания PEX-файлов. PEX расшифровывается как исполняемый файл Python и представляет собой формат файла, в котором хранятся автономные исполняемые виртуальные среды Python. pex Инструмент упаковывает эти среды в ZIP-файлы с помощью строки shebang и __main__.py модуля, который позволяет вам напрямую выполнить полученный файл PEX. Этот pex инструмент представляет собой расширение идей, изложенных в PEP 441.

Чтобы создать исполняемое приложение с pex помощью , вам сначала нужно установить его:

(venv) $ python -m pip install pex
(venv) $ pex --help
pex [-o OUTPUT.PEX] [options] [-- arg1 arg2 ...]

pex builds a PEX (Python Executable) file based on the given specifications:
sources, requirements, their dependencies and other options.
Command-line options can be provided in one or more files by prefixing the
filenames with an @ symbol. These files must contain one argument per line.
    ...

pex Инструмент предоставляет богатый набор опций, которые позволяют вам точно настраивать ваши PEX-файлы. Следующая команда показывает, как создать PEX-файл для reader проекта:

(venv) $ pex realpython-reader -c realpython -o realpython.pex

Эта команда создает realpython.pex в вашем текущем каталоге. Этот файл является исполняемым файлом Python для reader. Обратите внимание, что pex он обрабатывает установки reader и все его зависимости от PyPIreader Проект доступен в PyPI с именем realpython-reader, поэтому вы используете это имя в качестве первого аргумента pex.

Эта - c опция позволяет вам определить, какой консольный сценарий будет использоваться приложением. В этом случае консольный сценарий realpython определяется в setup.py файле reader-o Параметр указывает выходной файл. Как обычно, вы можете выполнить ./realpython.pex из командной строки запуск приложения.

Поскольку содержимое .pex файла распаковывается перед выполнением, приложения PEX устраняют ограничения zipapp приложений и позволяют выполнять код из .pyd.so.dll файлов, и.

Последняя деталь, которую следует отметить, заключается в том, что pex в результирующем файле PEX создается и упаковывается виртуальная среда Python. Такое поведение делает ваше приложение Zip намного больше, чем обычное приложение, созданное с zipapp помощью .

Второй инструмент, о котором вы узнаете в этом разделе, — это shiv. Это утилита командной строки для создания автономных Zip-приложений на Python, как описано в PEP 441. Преимущество по shiv сравнению с zipapp тем, что shiv автоматически включает все зависимости приложения в окончательный архив и делает их доступными в пути поиска модуля Python.

Для использования shiv вам необходимо установить его с PyPI:

(venv) $ python -m pip install shiv
(venv) $ shiv --help
Usage: shiv [OPTIONS] [PIP_ARGS]...

  Shiv is a command line utility for building fully self-contained Python
  zipapps as outlined in PEP 441, but with all their dependencies included!
    ...

--help Опция показывает полное сообщение об использовании, которое вы можете проверить для быстрого понимания того, как shiv это работает.

Для создания Zip-приложения на Python shiv вам потребуется устанавливаемое приложение на Python с setup.py pyproject.toml файлом или. К счастью, оригинальный reader проект с GitHub удовлетворяет этому требованию. Вернитесь в каталог, содержащий клонированную reader/ папку, и выполните следующую команду:

(venv) $ shiv -c realpython \
-o realpython.pyz reader/ \
-p "/usr/bin/env python3"

Как и в pex инструменте, shiv есть -c возможность определить консольный сценарий для приложения. Параметры -o и -p позволяют вам указать выходное имя файла и соответствующий интерпретатор Python соответственно.

Примечание: Приведенная выше команда работает, как и ожидалось. Однако текущая версия shiv (0.5.2) pip выводит сообщение об устаревании, касающееся того, как она создает пакеты. Поскольку shiv принимает pip аргументы напрямую, вы можете поместить --use-feature=in-tree-build их в конец команды, чтобы shiv pip безопасно использовать.

В отличие zipapp от , shiv позволяет использовать файлы .pyd.so, и.dll, которые вы храните в архиве приложения. Для этого shiv в архиве предусмотрена специальная функция начальной загрузки. Эта функция распаковывает зависимости приложения в .shiv/каталог в вашей домашней папке и добавляет их в Python sys.path.

Эта функция позволяет создавать автономные приложения, включающие библиотеки, частично написанные на языках C и C++ для повышения скорости и эффективности, такие как NumPy.

Вывод

Наличие быстрого и эффективного способа распространения исполняемых приложений Python может существенно повлиять на удовлетворение потребностей ваших конечных пользователей. Zip-приложения Python предоставляют эффективное и доступное решение для объединения и распространения готовых к запуску приложений. Вы можете использовать zipapp стандартную библиотеку Python для быстрого создания собственных исполняемых Zip-приложений и передачи их конечным пользователям.