TGTGInsighttelegram intelligenceLIVE / telegram public index
← Python Заметки
Python Заметки avatar

TGINSIGHT POST

Post #207

@pythonotes

Python Заметки

Views2,520Post view count
PostedJan 2701/27/2021, 09:00 AM
Post content

Post content

Вы уже знаете, что можно добавить ZIP архив в PYTHONPATH и использовать его как библиотеку. У Python есть еще одна интересная стандартная библиотека zipapp. Она поможет создать стендалон (или почти стендалон) приложение с помощью ZIP архива. На самом деле мы получим всё тот же архив но с некоторыми дополнениями 🔸 У него будет точка входа, то есть функция, которая запускается при старте приложения 🔸 У архива будет расширение PYZ, хотя, это тот же ZIP 🔸 Архив можно сделать исполняемым как простое приложение (только для Linux) Давайте создадим простое приложение. Можно указать директорию или файл. Удобней всего делать приложение из директории. При этом все файлы внутри указанного пути попадут в архив. Вот такая структура приложения у нас есть: myapp/ app.py А это код приложения # app.py def main(): print('START APP') Создаём ZIP-приложение: python3 -m zipapp myapp Скорее всего вы получите ошибку, так как не указана точка входа. ZipAppError: Archive has no entry point Чтобы это исправить следует в директории рядом с app.py создать файл __main__.py. Именно он будет выполняться при старте приложения. Либо просто указать флагом --main функцию внутри архива которую надо выполнить, и zipapp сам создаст этот файл с нужными импортами. python3 -m zipapp myapp --main=app:main Мы получим файл myapp.pyz который можно запустить с помощью Python $ python3 ./myapp.pyz START APP Чтобы запускать это приложение просто по даблклику без дописывания python, следует сделать файл исполняемым и в начало дописать так называемый shebang line (только для Linux). Вы скорее всего видели их в Bash-скриптах. Там написано с помощью какого интерпретатора запускать данный скрипт. В нашем случае надо дописать в начало ZIP-файла такую строку: #!/usr/bin/env python3 Это можно сделать с помощью флага --python python3 -m zipapp myapp --main=app:main --python '/usr/bin/env python3' Теперь в начало архива добавится нужная строка а сам файл станет исполняемым. А вот так можно добавить эту строку ручками после создания архива echo '#!/usr/bin/env python3' > myapp2.pyz cat ./myapp.pyz >> myapp2.pyz chmod +x myapp2.pyz Остаётся добавить флаг --compress чтобы сжать архив. python3 -m zipapp myapp --main=app:main --python '/usr/ bin/env python3' --compress Можно сказать, что наше элементарное приложение готово😎 Что ещë можно сделать? ▫️Как видите, это не полноценный стендалон. Для запуска приложения всё ещë требуется Python в системе. Чтобы ваше приложение завелось на чистой системе можно добавить в директорию myappвсе зависимости приложения, то есть любые нестандартные внешние библиотеки. Для работы приложения потребуется только сам Python. ▫️Можно добавлять любые файлы ресурсов. Для их использования потребуется извлечение этих файлов из архива. Например, если закинуть картинку в корень myapp myapp/ app.py image.jpg то достать её можно так: import pkgutil # достаём данные img_data = pkgutil.get_data('__main__', 'image.jpg') # сохраняем в файл open(filename, 'wb').write(img_data) ▫️На самом деле исполняемый файл можно сделать и для Windows, но там всё несколько сложней 😖 #tricks