Как установить архивированный python пакет
Перейти к содержимому

Как установить архивированный python пакет

  • автор:

DevOps Notes

Featured image of post Установка Python пакетов в оффлайн

Avatar

Создадим виртуальное окружение для того, чтобы скачать все зависимости, но при этом не захватить ненароком лишнего. Поставим virtualenv.

python3 -m pip install --upgrade --user virtualenv python3 -m pip virtualenv venv 

Теперь можем активировать его.

. ./venv/bin/activate 

Теперь до конца терминальной сессии, мы в изолированном Python virtualenv.

Готовим нужные пакеты ¶

Установив в чистом окружении только то, что нужно, мы заодно подтянем все зависимости, но кроме всего прочего, захватите с собой ещё setuptools и pip.

python3 -m pip install --upgrade pip setuptools ansible 

Теперь можем составить список того, что получилось.

python3 -m pip freeze > requirements.txt 

Можно просто дописать pip и setuptools в requirements.txt без указания версий (если их вообще нет в списке)

Пример requirements.txt

 1 2 3 4 5 6 7 8 9 10 11 12 
ansible==3.4.0  ansible-base==2.10.11  cryptography==2.8  jinja2==2.11.3  netaddr==0.7.19  pbr==5.4.4  jmespath==0.9.5  ruamel.yaml==0.16.10  ruamel.yaml.clib==0.2.2  MarkupSafe==1.1.1  pip  setuptools 

Имея список пакетов с зависимостями, мы можем их скачать даже без venv.

python3 -m pip download --dest my-pip-packages -r requirements.txt 

Для удобства, упакуем всё в архив.

tar -cpvzf pips.tgz my-pip-packages requirements.txt 

Устанавливаем в окружении без Интернета ¶

Python должен быть уже установлен заранее

  1. Добавить sudo в начале
  2. Добавить аргумент —user к pip-у для установки пакетов только для пользователя выполняющего команду
1 2 3 
tar -xpzvf pips.tgz python3 -m pip install --upgrade --no-index --find-links python-packages pip setuptools python3 -m pip install --upgrade --no-index --find-links my-pip-packages -r requirements.txt 

Теперь можно запускать Ansible!

1 2 3 4 5 6 7 
root@289f34a67cbd:/host# ansible --version ansible 2.10.11  config file = None  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']  ansible python module location = /usr/local/lib/python3.6/dist-packages/ansible  executable location = /usr/local/bin/ansible  python version = 3.6.9 (default, Jan 26 2021, 15:33:00) [GCC 8.4.0] 

Локали ¶

Случалось так, что в сильно урезанном окружении, как, к примеру, Docker Ubuntu 18.04, утановка пакетов падает со следующей ошибкой.

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
ERROR: Exception: Traceback (most recent call last):  File "/usr/local/lib/python3.6/dist-packages/pip/_internal/cli/base_command.py", line 173, in _main  status = self.run(options, args)  File "/usr/local/lib/python3.6/dist-packages/pip/_internal/cli/req_command.py", line 203, in wrapper  return func(self, options, args)  File "/usr/local/lib/python3.6/dist-packages/pip/_internal/commands/install.py", line 316, in run  reqs, check_supported_wheels=not options.target_dir .  File "/usr/local/lib/python3.6/dist-packages/pip/_internal/operations/prepare.py", line 249, in unpack_url  unpack_file(file.path, location, file.content_type)  File "/usr/local/lib/python3.6/dist-packages/pip/_internal/utils/unpacking.py", line 256, in unpack_file  untar_file(filename, location)  File "/usr/local/lib/python3.6/dist-packages/pip/_internal/utils/unpacking.py", line 226, in untar_file  with open(path, "wb") as destfp: UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 117: ordinal not in range(128) 

Решается установкой переменных окружения перед установкой пакетов.

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
export LANGUAGE="" export LANG="C.UTF-8" export LC_CTYPE="C.UTF-8" export LC_NUMERIC="C.UTF-8" export LC_TIME="C.UTF-8" export LC_COLLATE="C.UTF-8" export LC_MONETARY="C.UTF-8" export LC_MESSAGES="C.UTF-8" export LC_PAPER="C.UTF-8" export LC_NAME="C.UTF-8" export LC_ADDRESS="C.UTF-8" export LC_TELEPHONE="C.UTF-8" export LC_MEASUREMENT="C.UTF-8" export LC_IDENTIFICATION="C.UTF-8" export LC_ALL="C.UTF-8" 

Licensed under Apache License, Version 2.0

Обновлено Dec 01, 2023 14:46 +0200

Упаковать код

Код можно загрузить через панель управления или API. Можно использовать один файл или загрузить пакет (модуль) архивом.

Python ⁠ ​

Код одним файлом ⁠ ​

Создайте файл с функцией без импорта сторонних пакетов:

def handler(**kwargs): return f"Hello, kwargs>" 

Код одним файлом с библиотеками для обработки изображений ⁠ ​

В среде выполнения Python предустановлены различные пакеты и библиотеки, которые оптимизированы для обработки изображений:

  • Pillow;
  • opencv-python с нужными стандартными библиотеками;
  • pyzbar с libzbar;
  • numpy;
  • imutils.

К этим библиотекам можно обращаться, загрузив исходный код в виде одного файла.

Код в виде пакета (модуль) ⁠ ​

Загрузка кода в виде пакета позволяет включить не только несколько файлов проекта, но и указать его зависимости. Перед загрузкой через панель управления или API пакет следует заархивировать (.zip или .tar*).

Для создания python-пакета используйте инструкцию Packaging Python Projects. Для установки пакетов и их зависимостей используется менеджер pip.

Node.js ⁠ ​

Код одним файлом ⁠ ​

Создайте файл с функцией без импорта сторонних библиотек:

module.exports.main = (event) =>   return `Hello, $event>` > 

Код в виде пакета (модуль) ⁠ ​

Загрузка кода в виде пакета позволяет включить не только несколько файлов проекта, но и указать его зависимости. Перед загрузкой через панель управления или API пакет следует заархивировать (.zip или .tar*).

Создайте папку и добавьте в неё файлы с вашим кодом и package.json, в котором указаны зависимости. Затем заархивируйте папку (.zip или .tar*) и загрузите архив через панель управления или API.

  • Python
    • Код одним файлом
    • Код одним файлом с библиотеками для обработки изображений
    • Код в виде пакета (модуль)
    • Код одним файлом
    • Код в виде пакета (модуль)

    Установка pip из архива Windows

    Я хочу упаковать питон и все зависимости моего кода в один дистрибутив. Скачал архив с питоном, прописал путь к нему в моих скриптах, работает. Не могу разобраться, как установить другие модули. Если скачивать их и пытаться запустить, получаю ошибку

    Traceback (most recent call last): File "./packages/setuptools-51.1/setuptools-51.1.0/setup.py", line 7, in import setuptools ModuleNotFoundError: No module named 'setuptools' 

    Скрипт, который я запускаю:

    #! ./python-3.6.5-embed-amd64/python.exe from subprocess import call call(["python", "./packages/setuptools-51.1/setuptools-51.1.0/setup.py"]) 

    Но чтобы поставить тот же setuptools нужен setuptools . Как еще можно установить pip или setuptools из локальной директории?

    Управление пакетами Python при помощи easy_install

    Инструмент easy_install является модулем набора расширений к distutils языка Python — setuptools. Согласно официальной документации «Easy Install — это модуль Python (easy_install), идущий в комплекте библиотеки setuptools, которая позволяет автоматически загружать, собирать, устанавливать и управлять пакетами языка Python». Пакеты носят название «eggs» и имеют расширение .egg. Как правило, эти пакеты распространяются в формате архива ZIP.

    Использование easy_install

    Для начала установим пакет setuptools для Python версии 2.7:
    $ wget pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg
    $ sudo sh setuptools-0.6c11-py2.7.egg

    Теперь можно установить любой пакет, находящийся в центральном репозитарии модулей языка Python, который называется PyPI (Python Package Index): pypi.python.org/pypi. Работа с easy_install напоминает работу с пакетными менеджерами apt-get, rpm, yum и подобными. Для примера установим пакет, содержащий оболочку IPython:
    sudo easy_install ipython
    В качестве аргумента указывается либо имя пакета, либо путь до пакета .egg, находящегося на диске. Обратите внимание, что для выполнения установки требуются права суперпользователя, так как easy_install установлен и сам устанавливает пакеты в глобальный для Python каталог site-packages. Установка easy_install в домашнюю директорию производится следующим образом: sh setuptools-0.6c11-py2.7.egg —prefix=~

    Поиск пакета на веб-странице:
    easy_install -f code.google.com/p/liten liten
    Первый аргумент в данном примере — это на какой странице искать, второй — что искать.
    Также предусмотрена возможность HTTP Basic аутентификации на сайтах:
    easy_install -f user:password@example.com/path/

    Установка архива с исходными кодами по указанному URL:
    easy_install liten.googlecode.com/files/liten-0.1.5.tar.gz
    В качестве аргумента достаточно передать адрес архива, а easy_install автоматически распознает архив и установит дистрибутив. Чтобы этот способ сработал, в корневом каталоге архива должен находиться файл setup.py.

    Для обновления пакета используется ключ —upgrade:
    easy_install —upgrade PyProtocols

    Также easy_install может немного облегчить установку распакованного дистрибутива c исходными кодами. Вместо последовательности команд python setup.py install достаточно просто ввести easy_install , находясь в каталоге с исходниками.

    Изменение активной версии установленного пакета:
    easy_install liten=0.1.3
    В данном случае производится откат пакета liten до версии 0.1.3.

    Преобразование отдельного файла .py в пакет .egg

    easy_install -f «http://some.example.com/downloads/foo.py#egg=foo-1.0» foo
    Это полезно, когда, например, необходимо обеспечить доступ к отдельному файлу из любой точки файловой системы. Как вариант, можно добавить путь к файлу в переменную PYTHONPATH . В этом примере #egg=foo-1.0 — это версия пакета, а foo — это его имя.

    Использование конфигурационных файлов

    Для опытных пользователей и администраторов предусмотрена возможность создания конфигурационных файлов. Значения параметров по умолчанию можно задать в конфигурационном файле, который имеет формат ini-файла. easy_install осуществляет поиск конфигурационного файла в следующем порядке: текущий_каталог/setup.cfg, ~/.pydistutils.cfg и в файле distutils.cfg, в каталоге пакета distutils.
    Пример такого файла:
    [easy_install]

    # где искать пакеты
    find_links = code.example.com/downloads

    # ограничить поиск по доменам
    allow_hosts = *.example.com

    # куда устанавливать пакеты (каталог должен находиться в переменной окружения PYTHONPATH)
    install_dir = /src/lib/python

    Используемые источники:
    peak.telecommunity.com/DevCenter/EasyInstall — официальная документация
    «Python в системном администрировании UNIX и Linux», Ноа Гифт и Джереми М. Джонс

    • easy_install
    • python
    • управление пакетами

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *