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

Установка Python пакетов в оффлайн

Хитрости по установке пакетов в оффлайн на Ubuntu 18.04

Допустим, мы хотим поставить Ansible в оффлайне.

Создаём Virtualenv

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

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

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

1
. ./venv/bin/activate

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

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

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

1
python3 -m pip install --upgrade pip setuptools ansible

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

1
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.

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

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

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

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

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

Распакуем свой архив и установим всё что принесли. Pip и setuptools поставим отдельно в начале, а потом всё остальное. Если команда выполняется не от имени суперпользователя, то нужно либо:

  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
All rights reserved
Создано при помощи Hugo
Тема Stack, дизайн Jimmy