
Я хотел бы использовать только одну версию 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):
В
/etc/portage/make.conf
добавьте или обновитеPYTHON_TARGETS
иPYTHON_SINGLE_TARGET
к версии Python, которую я хочу использовать (например,PYTHON_TARGETS="python3_9 python3_8"
иPYTHON_SINGLE_TARGET="python3_9"
). Обратите внимание, что вики Gentoo рекомендует делать это вpackage.use
: любой из вариантов должен сработать, поскольку это глобальное изменение.Запустите
emerge -puvDN --with-bdeps=y @world
, чтобы убедиться, что ни один пакет не недовольен изменениями.Добавьте или обновите флаги Python
USE
для отдельных пакетов.
Я настоятельно не рекомендую использоватьemerge -C
если вы неабсолютноубедитесь, что ни один пакет не использует этот пакет! Особенно в случае Python, вы можете сделать так, что это emerge
вообще не будет работать.