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, py2exe, py2app, Nuitka и другие. Эти инструменты позволяют создавать автономные исполняемые приложения, которые можно распространять среди конечных пользователей. Однако настройка этих инструментов может быть сложным и сложным процессом.
Иногда вам не нужна такая дополнительная сложность. Вам просто нужно создать исполняемое приложение из сценария или небольшой программы, чтобы вы могли быстро распространить его среди конечных пользователей. Если ваше приложение достаточно маленькое и использует чистый код 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, вы можете выполнить следующие общие действия:
- Создайте исходный каталог приложения, содержащий
__main__.py
модуль. - Заархивируйте исходный каталог приложения.
- Добавьте необязательную строку shebang Unix, чтобы определить интерпретатор для запуска приложения.
- Сделайте 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_function . main_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
и все его зависимости от PyPI. reader
Проект доступен в 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-приложений и передачи их конечным пользователям.