Я хотел бы иметь несколько виртуальных сред, некоторые из которых имеют другую версию Python. Я не уверен в базовой версии Python, которую мне следует использовать. Например, если я создаю venv
зависимые виртуальные среды с использованием Python, предоставляемого моей текущей ОС Ubuntu, скажем, 3.8, а позже я обновляю саму Ubuntu и обновляю Python до версии 3.10, будут ли виртуальные среды, созданные в предыдущей версии Ubuntu, работать?
Принцип работы venv заключается в том, что они берут с собой всю среду выполнения Python. Действительно, если вы активируете venv, а затем запустите which python
, вы увидите не свой системный Python, а тот, который установлен venv.
Таким образом, если вы обновите свою ОС и одновременно обновите свой системный Python, вам не о чем беспокоиться, потому что на вашем venv все еще будет установлена старая версия.
Это не совсем так. Venvs не включают в себя всю среду выполнения Python; venv зависит от целостности базового интерпретатора Python.
@AKX ох, интересно узнать, я понятия не имел. Тогда это просто символическая ссылка на системный двоичный файл?
виртуальная среда по существу копируется из установки ОС в venv, поэтому вы будете поддерживать все библиотеки в папке venv.
При обновлении ОС двоичные файлы останутся там, и обе версии будут доступны в разных версиях.
Это не совсем так. Не все копируется; venv действительно зависит от целостности базового интерпретатора Python.
Virtualenvs действительно зависят от целостности их базового интерпретатора.
Если обновление ОС (или любой другой процесс) удалит, скажем, python3.8
, то нет, venvs, базовым интерпретатором которого является этот python3.8
, больше не будет работать.
Чтобы продемонстрировать это в контейнере Docker, давайте установим Python 3.10 и 3.11, создадим venv с обоими из них, затем удалим один базовый интерпретатор и увидим, что соответствующий venv больше не работает:
~ $ docker run -it ubuntu:22.04 bash
# apt update
[...snip...]
# apt install -y python3.10 python3.11 python3.10-venv python3.11-venv
[...snip...]
# python3.10 -m venv venv-310
# python3.11 -m venv venv-311
# venv-310/bin/python --version
Python 3.10.12
# venv-311/bin/python --version
Python 3.11.0rc1
# apt purge 'python3.10-*'
[...snip...]
# venv-310/bin/python --version
bash: venv-310/bin/python: No such file or directory
# venv-311/bin/python --version
Python 3.11.0rc1
#
Спасибо. Это было очень полезно. Я знал о копировании файлов Python, но не был уверен в зависимости от базы. Я совершенно не понимаю, почему такая основная опасность не упоминается во многих руководствах по виртуальным средам.
Что ж, виртуальные среды должны быть одноразовыми, и вы должны стремиться к тому, чтобы ваши виртуальные среды можно было воссоздать в любое время :)
И да, и нет: указывая --copies
, иногда можно создать полностью автономную среду. Фактически, если я попробую именно то, что вы сделали, но используя --copies
, среда продолжит работать после удаления системной установки Python. Однако это ненадежно и зависит от того, как был построен Python. В другом сценарии двоичный файл Python ссылается на системные библиотеки, которые сейчас отсутствуют.
@KonradRudolph, значит, лучше использовать специальную базовую версию с использованием Miniconda?
@xinit Путь... чего добиться?
@xinit Зависит от вашего варианта использования. Я не использую и не рекомендую Conda. По моему опыту, это создает больше проблем, чем решает. Но у меня есть полный контроль над установкой моей системы (точнее: там, где у меня нет полного контроля и мне нужна автономная установка, я либо использую контейнеры, либо устанавливаю свой собственный Python).
Обратите внимание: Rye (экспериментальный инструмент для управления полными цепочками инструментов Python) использует автономные сборки Python indygreg/python-build-standalone.
@KonradRudolph, извини за неопределенность в моем вопросе. Я имел в виду создание venv с использованием Python на основе Miniconda. Таким образом, venvs не будет зависеть от системного Python.
Спасибо. Могу ли я продолжать добавлять больше виртуальных сред, не беспокоясь о базовом Python?