Рубрики
Без рубрики

Среда связывания питона в архиве Zip

Доставка зависимостей для ваших сценариев в качестве единого файла, построенного с «Shiv». Основная IDE … с меткой питона, DevOps, развертывания, упаковки.

Доставка зависимостей для ваших сценариев в качестве единого файла, построенного с «Shiv».

Основная мысль

Если у вас есть набор сценариев Python, которые используют один и тот же набор необходимых пакетов, вы можете распространять эти зависимости в виде Zipapp, то есть в одном исполняемом файле. Смотрите Здание Zipapps (PEP 441) Для деталей Если вы новичок в концепции пучков приложения Python

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

Вы также можете развернуть любое Pypi Пакет таким образом, с простым вызовом Шив , как показано в следующем разделе с использованием Панды Анкет

Практический пример

В следующем примере используется хорошо известный Панды Библиотека Data Science, но это работает для любого проекта, построенного с Setuptools или любым другим инструментом сборки, создавая пакеты Python, которые объявляют их требования.

Итак, чтобы создать артефакт выпуска базовой библиотеки, установить и вызовать Шив как это:

python3.8 -m pip install --user shiv
python3.8 -m shiv -p '/usr/bin/python3.8 -IS' \
                  -o ~/bin/_lib-pandas pandas==1.0.1

Сделайте это в виртуальном виде и оставьте -USER Опция, если вы хотите сохранить домашний каталог вашей учетной записи в чистоте.

Обратите внимание, что мы не предоставляем точку входа здесь, что означает, что этот Zipapp падает в данную интерпретатор Python и, таким образом, используется как переводчик, с содержащимися пакетами, доступными для Импорт Анкет

Теперь мы можем использовать это, чтобы написать сценарий, используя Zipapp в качестве интерпретатора:

cat >script <<'EOF'
#! /usr/bin/env _lib-pandas
import re
import sys
from pathlib import Path
import pandas as pd

print('Using Pandas from',
      Path(pd. __file__ ).parent.relative_to(Path.home()),
      '\n\nPython path:')
df = pd.DataFrame(sys.path, columns=['Path'])
df.Path = df.Path.str.replace(f'^{ re.escape(str(Path.home())) }/', '~/')
print(df)
EOF
chmod +x script
./script

Вызов сценария создает следующий выход:

Using Pandas from .shiv/_lib-pandas_23b2…d2/site-packages/pandas 

Python path:
                                                Path
0 ~/bin/_lib-pandas
1 /usr/lib/python38.zip
2 /usr/lib/python3.8
3 /usr/lib/python3.8/lib-dynload
4 ~/.shiv/_lib-pandas_23b2bb7d64c26139950435a64d...

Если вы знакомы с Pandas, вы мгновенно распознаете выход пути Python как поступающий из кадры данных Pandas. 🎉

Это первое выполнение немного медленно при запуске, потому что каталог кэша, который вы видите в конце пути Python, должен быть заполнен в первую очередь. Код Shiv’s Boot-Strance Code распаковывает пакеты расширения, содержащие собственный код в файловую систему, чтобы ОС может загрузить их.

Подчеркивая префикс в имени Zipapp указывает, что это не команда, обычно используя люди. В качестве альтернативы и особенно в производстве вы можете развернуть, например, /usr/local/lib/python3.8/ а затем используйте абсолютный путь вместо env Позвоните как переводчик сценария.

Оригинал: “https://dev.to/jhermann/bundling-python-environments-in-a-zip-archive-2oe5”