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

Функции create_archive() модуля zipapp в Python

Программное создание архива приложения Python

Синтаксис:

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())