import zipapp zipapp.create_archive(source, target=None, interpreter=None, main=None, filter=None, compressed=False)
source
- источник для создания исполняемого архива,target=None
- цель, куда будет записан исполняемый архив,interpreter=None
- интерпретатор для исполнения программы в архиве,main=None
- основная программа для архива,filter=None
- функция фильтра файлов, добавляемых в архивcompressed=False
- сжатие архива приложения.Функция create_archive()
модуля zipapp
создает исполняемый архив приложения из источника source
.
Источником source
может быть любое из следующего:
target
изменяя его, чтобы отразить значение, данное для аргумента interpreter
. Имя файла должно включать расширение .pyz, если требуется.Аргумент target
определяет, куда будет записан результирующий архив:
source
должен быть каталог, а целью будет файл с тем же именем, что и источник, с добавлением расширения .pyz
.Аргумент interpreter
указывает имя интерпретатора Python, с которым будет выполняться архив. Он записывается в виде строки shebang
в начале архива. В POSIX данная строка будет интерпретироваться операционной системой, а в Windows - обработчиком Python. Если указан аргумент interpreter
, а целью target
является имя файла, будет установлен исполняемый бит целевого файла.
Аргумент main
указывает имя вызываемого объекта, который будет использоваться в качестве основной программы для архива. Его можно указать только в том случае, если источником является каталог, а источник еще не содержит файл __main__.py
. Аргумент main
должен иметь форму 'pkg.module: callableи архив будет запущен путем импорта pkg.module и выполнения вызываемого объекта
callableбез аргументов. Если источник
sourceявляется каталогом и не содержит файл
main.py, а аргумент
main` не указан или пропущен, то результирующий архив не будет исполняемым.
Необязательный аргумент filter
указывает функцию обратного вызова, которой передается объект path
, представляющий путь к добавляемому файлу в приложение-архив относительно исходного каталога. Функция обратного вызова должна вернуть True
, если файл должен быть добавлен.
Необязательный аргумент compressed
определяет, будут ли файлы сжаты. Если установлено значение True
, файлы в архиве сжимаются методом deflate
. В противном случае файлы хранятся без сжатия. Этот аргумент не действует при копировании существующего архива.
Если для источника source
или цели target
указан файловый объект, то вызывающая сторона должна закрыть его после вызова функции zipapp.create_archive()
.
source
или target
нуждаются только в методах file.read()
и file.readline()
или file.write()
. target
является файловый объект, он будет передан в класс zipfile.ZipFile()
и должен предоставить методы, необходимые для этого класса.Упакуйте каталог myapp
в архив myapp.pyz
.
>>> import zipapp >>> zipapp.create_archive('myapp', 'myapp.pyz')
Чтобы заменить строку shebang
в существующем архиве, создайте измененный архив с помощью функции zipapp.create_archive()
:
>>> import zipapp >>> zipapp.create_archive('old_archive.pyz', 'new_archive.pyz', '/usr/bin/python3')
Чтобы обновить файл на месте, выполните замену в памяти с помощью объекта BytesIO
, а затем перезапишите источник.
Обратите внимание, что при перезаписи файла на месте существует риск, что ошибка приведет к потере исходного файла. Этот код не защищает от таких ошибок. Также этот метод будет работать, только если архив помещается в памяти:
>>> import zipapp >>> import io >>> temp = io.BytesIO() >>> zipapp.create_archive('myapp.pyz', temp, '/usr/bin/python3') >>> with open('myapp.pyz', 'wb') as f: >>> f.write(temp.getvalue())