Как заставить пакет использовать версию Python в Gentoo?

Как заставить пакет использовать версию Python в Gentoo?

Я хотел бы использовать только одну версию Python3 для всех моих пакетов в системе Gentoo. Поэтому я поискал установленные версии и обнаружил, что установлено три версии: 3.6, 3.7 и 3.8. Я хотел бы преобразовать все пакеты в 3.8 и удалить предыдущие версии.

Мой план:

  • Разделите Python 3.6 и 3.7.
  • Установите USEфлаг для пакетов, использующих Python, на python3_8 -python3_7 -python3_6.
  • Пересоберите эти пакеты, чтобы emerge --update --newuseони могли использовать Python 3.8.

Итак, после удаления Python 3.6 с помощью:

emerge --ask -C dev-lang/python:3.6

Я добавил строку

virtual/python-ipaddress python3_8 -python3_7 -python3_6

/etc/portage/package.useи бежать

emerge --ask --update --newuse --deep virtual/python-ipaddress

и я получаю

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  NS    ] dev-lang/python-3.6.11-r2 [2.7.18-r1, 3.7.8-r2, 3.8.4-r1] USE="(threads%*)"

Would you like to merge these packages? [Yes/No]

Я не понимаю этого поведения: почему emerge хочет установить, python-3.6если /etc/portage/package.useуказано, что он должен использовать 3.8? И почему USEпеременная не содержит никакой спецификации Python? Есть ли другой файл конфигурации, который имеет более высокий приоритет, чем /etc/portage/package.useи переопределяет USEпеременную? Из того, что я понял, прочитавдокументация, этого не должно происходить.


решение1

Кстати, python — это не обычный пакет в Gentoo. (в основном потому, чтопортажсам зависит от python.) => Другие переменные также важны для установки. И должны быть согласованными. Идея USE-флагов заключается в том, что они зарезервированы для установки пользовательских настроек. Настроек, которые могут, в худшем случае, сделать один пакет нефункциональным, но ни в коем случае не сломать всю систему.

Версия Python определенноНЕТпредпочтение пользователя. НЕТ! Пользователь просто не может проснуться и решить: Я хочу только Phython XYZ! Ну... да... пользователь может... За свой счет.


Чтобы достичь вашей цели (насколько я понимаю), я бы определенно не стал продолжать (очень рискованный*) как вы следовали.

Я бы предпочел следовать процедуре, подробно описаннойздесь под абзацемОбновление версии.

Кстати: Также позаботьтесь оeselectштуковина.

Не говоря уже о том, что это просто так, из интереса... в конце концов... какого черта вам это нужно?

Tux ~ $ equery size python-2.7.18-r1
dev-lang/python-2.7.18-r1
          Total files : 4177
          Total size  : 63.28 MiB
Tux ~ $ equery size python-3.7.8-r2
dev-lang/python-3.7.8-r2
          Total files : 6616
          Total size  : 98.74 MiB

Восстановление менее 200 МБ в общей сложности с потенциальными расходами на поломку разных интересных вещей?

Обратите внимание! : Вы никогда на самом деле неконвертировать, портировать программу с одной языковой версии на другую, изменяя флаги использования. Вы просто свяжете ее с некоторыми другими библиотеками, которые, если программа несовместима, просто сломают все.


Очень рискованно (*): я бы никогда не пытался удалить какой-либо пакет до проверки того, что ни один установленный пакет не зависит от него. Я имею в виду программы, которые не были перенесены с python 2 на python 3, например. (Лично у меня есть пара таких, которые определенно оправдывают существование python-2.7.18-r1 на моих системах)

Не говоря уже о том, что если вы успешно удалили 3.6 и 3.7, вы почти наверняка сломали не меньше, чем glib (2.62.6), wireshark, git... последние стабильные версии которых, насколько я могу судить, пока несовместимы с 3.8...

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

решение2

Как уже отмечалось в предыдущих ответах, небезопасно удалять пакет, а затем пытаться изменить конфигурацию, чтобы сделать его ненужным. Безопасный подход заключается в обратном - изменить конфигурацию (настроить USE-флаги, (де)маскировать версии), чтобы система сама распознала, что пакет не нужен (для этого может потребоваться переустановка нескольких пакетов), и система сама удалит его через emerge --depclean.

Что касается изначального вопроса, где python был принудительно удален, просто поставьте --treeопцию в команду emerge update. Затем она выведет не только список пакетов для установки, но и то, что привело их в дерево.

Скорее всего, есть пакет, который все еще зависит от python:3.6.

решение3

Когда я обновляю Python, вот шаги, которые я делаю (частично основанные навики Gentoo):

  1. В /etc/portage/make.confдобавьте или обновите PYTHON_TARGETSи PYTHON_SINGLE_TARGETк версии Python, которую я хочу использовать (например, PYTHON_TARGETS="python3_9 python3_8"и PYTHON_SINGLE_TARGET="python3_9"). Обратите внимание, что вики Gentoo рекомендует делать это в package.use: любой из вариантов должен сработать, поскольку это глобальное изменение.

  2. Запустите emerge -puvDN --with-bdeps=y @world, чтобы убедиться, что ни один пакет не недовольен изменениями.

  3. Добавьте или обновите флаги Python USEдля отдельных пакетов.

Я настоятельно не рекомендую использоватьemerge -C если вы неабсолютноубедитесь, что ни один пакет не использует этот пакет! Особенно в случае Python, вы можете сделать так, что это emergeвообще не будет работать.

Связанный контент