Как установить пакеты DNF с помощью Yum, когда пакеты Python находятся в другом месте?

Вопрос или проблема

У нас есть сервер RHEL 8.10, и стандартное расположение для Python-пакетов находится в /usr/lib/python3.6/site-packages/. Это, конечно, включает в себя и DNF-пакеты, которые расположены в /usr/lib/python3.6/site-packages/dnf.

Мы установили новую версию Python (3.8), и вот пакеты, которые у нас есть:

ls -ltr /usr/lib/python3.8/site-packages/

total 8
-rw-r—r— 1 root root 126 Aug 6 2023 easy_install.py
drwxr-xr-x 2 root root 82 Mar 24 17:57 __pycache__
drwxr-xr-x 2 root root 170 Mar 24 17:57 setuptools-41.6.0.dist-info
drwxr-xr-x 5 root root 94 Mar 24 17:57 pkg_resources
drwxr-xr-x 6 root root 4096 Mar 24 17:57 setuptools
drwxr-xr-x 2 root root 130 Mar 24 17:57 pip-19.3.1.dist-info
drwxr-xr-x 5 root root 95 Mar 24 17:57 pip

Теперь мы хотим установить DNF-пакеты, которые должны быть расположены в /usr/lib/python3.8/site-packages/.

Проблема в том, что когда мы пытаемся установить DNF, используя следующую команду:

yum localinstall python3-dnf-4.7.0-20.el8.noarch.rpm

Он не устанавливается под путь /usr/lib/python3.8/site-packages/.

Какой правильный способ установки DNF-пакетов в /usr/lib/python3.8/site-packages/?

Я также пытался сделать это, но это не помогло

PYTHONPATH=/usr/lib/python3.8/site-packages
yum localinstall python3-dnf-4.7.0-20.el8.noarch.rpm
Last metadata expiration check: 0:30:53 ago on Mon 24 Mar 2025 06:35:20 PM UTC.
Package python3-dnf-4.7.0-20.el8.noarch is already installed.
Dependencies resolved.Nothing to do.
Complete!

Вы не можете этого сделать, так Python-пакеты (или RPM-пакеты в целом) не работают. Пакет RPM python3-dnf-4.7.0-20.el8 был собран с использованием Python 3.6 и может использоваться только с Python 3.6.

RPM-пакет — это просто архив (с некоторыми метаданными), пути не являются динамическими и определяются на этапе сборки, их нельзя изменить во время установки пакета. Если вы извлечете пакет, вы можете увидеть все файлы с полными путями:

$ rpm2cpio python3-dnf-4.7.0-20.el8.noarch.rpm | cpio -idmv./usr/bin/dnf-3./usr/lib/python3.6/site-packages/dnf…

Если вы хотите установить версию DNF для Python 3.8, вам нужна версия DNF для Python 3.8 (которая недоступна для RHEL 8) или соберите ее из исходников. Но будьте осторожны, очень легко нарушить работу вашей системы, если вы начнете изменять системный Python и системные инструменты, такие как DNF. Я не уверен, какова ваша цель, но настоятельно рекомендую использовать виртуальные окружения для этого.

Если ваша цель — заменить Python 3.6 на 3.8 по всей системе и заменить все системные пакеты на версии для Python 3.8, то ответ: НЕ НАДО. Вам придется пересобрать большую часть вашей системы (по крайней мере, всё в системе, зависящее от Python) с нуля, и, вероятно, вы уничтожите свою систему в процессе. Если вам нужна более новая версия Python по всей системе, вам нужно обновиться до более новой версии RHEL (RHEL 9 поставляется с Python 3.9).

Ответ или решение

Установка DNF-пакетов с использованием Yum, когда пакеты Python находятся в другом месте, представляет собой весьма специфическую задачу, особенно на сервере RHEL 8.10, где по умолчанию интеграции с Python выполняются посредством системной версии Python. Рассмотрим теоретическую основу, возможные примеры, и затем применим их на практике, чтобы максимально точно ответить на данный вопрос.

Теория

Система управления пакетами RPM (Red Hat Package Manager) на RHEL 8.10 работает таким образом, что пути установки файлы в пакетах заранее определены при сборке этих пакетов. Это означает, что, если пакет python3-dnf-4.7.0-20.el8.noarch.rpm был собран для установки в директорию Python 3.6, перенаправить его автоматически в другую директорию для Python 3.8 не получится.

DNF — это текущее поколение инструментов управления пакетами на основе Python для Fedora и RHEL. Оно тесно связано с конкретной версией Python, используемой в операционной системе. В RHEL 8 используется Python 3.6 как системная версия, и большинств системных инструментов тесно завязано именно на этой версии Python.

Пример

Предположим, мы имеем систему, где приложение построено на Python 3.8, и требуется использовать DNF в этой среде. При этом давайте сравним использование RPM-пакета, который был собран для Python 3.6, и то, что может возникнуть, если попытаться «переустановить» пакет в другом месте:

  1. Извлечение содержимого RPM-пакета:rpm2cpio python3-dnf-4.7.0-20.el8.noarch.rpm | cpio -idmvЭто покажет вам, что все файлы имеют жестко закодированные пути, такие как ./usr/lib/python3.6/site-packages/dnf.
  2. Установка пакета:
    Выполнение команды yum localinstall python3-dnf-4.7.0-20.el8.noarch.rpm приведет к размещению файлов в таких же жестко закодированных местах.

Применение

Понимание ограничений использования разных версий Python в среде RHEL 8.10 подсказывает, что наиболее рациональным способом достижения гибкости будет использование виртуальных окружений Python. Это позволит изолировать необходимые компоненты и зависимости внутри собственного пространства, не затрагивая системные пакеты.

  1. Создание и активация виртуального окружения:python3.8 -m venv myenvsource myenv/bin/activate
  2. Установка необходимых пакетов:
    В активированном окружении можно использовать pip для установки любого пакета Python. Что касается DNF, если бы его исходники совместимы с установленной версией Python, их можно было бы установить через pip. Однако в случае DNF такой подход, скорее всего, нельзя будет осуществить, так как в поставках RHEL/DNF Python используется для ОС-оптимальных решений, и их медикация под другие версии Python не поддерживается.
  3. Рекомендации:
    • Не рекомендуется заменять системную версию Python. Это критично для продуктивной работы всей системы, и может привести к невозможности установить обновления и зависимости, специфичные для RHEL 8.10.
    • Если все-таки требуется работа с более новой версией Python на уровне всей системы, более безопасным будет обновление RHEL до версии 9, которая уже подразумевает Python 3.9.

Таким образом, чтобы установить DNF под альтернативной версией Python, вам потребуется не только пересборка самого пакета под нужную версию, что является сверхсложной и рискованной задачей, но и полное понимание того, как работает данный программный стек. Подход с использованием виртуальных окружений Python гораздо более гибок и безопасен.

В заключение, настоятельно рекомендуется принять стратегию использования модернизированных или новых системных платформ (наподобие RHEL 9) для всех нужд, где требуются более современные версии Python, так как это сэкономит время и минимизирует возможные риски и неполадки в работе системы.

Друзья помогите этому контенту стать доступнее в социальных сетях.

Не проходи мимо жмакни по кнопке возможно кому то еще он будет полезен!