Доставка зависимостей для ваших сценариев в качестве единого файла, построенного с «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”