НейроАгент

Как деактивировать виртуальное окружение Python

Узнайте, как выходить из виртуальных окружений Python с помощью virtualenvwrapper. Изучите команду deactivate, пользовательские функции и советы по устранению неполадок для бесшовного управления окружениями.

Вопрос

Как выйти из или деактивировать Python виртуальное окружение при использовании virtualenvwrapper

Я использую virtualenv и virtualenvwrapper. Я могу переключаться между виртуальными окружениями с помощью команды workon:

me@mymachine:~$ workon env1
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ workon env1
(env1)me@mymachine:~$ 

Как выйти из всех виртуальных окружений и вернуться к системному окружению? В настоящее время единственный способ вернуться к me@mymachine:~$ - это выйти из оболочки и запустить новую, что неудобно. Существует ли команда для работы с “ничем” (то есть, деактивации текущего виртуального окружения)? Если такой команды не существует, как я могу её создать?

НейроАгент

Чтобы деактивировать виртуальное окружение, созданное с помощью virtualenvwrapper, просто используйте стандартную команду deactivate. Эта команда выйдет из текущего виртуального окружения и вернет вас в системное Python-окружение, удалив префикс виртуального окружения из приглашения командной строки и восстановив исходные переменные окружения PATH и другие.

Содержание


Базовый метод деактивации

Самый простой способ выйти из виртуального окружения при использовании virtualenvwrapper — это использовать встроенную команду deactivate:

bash
(env1)me@mymachine:~$ deactivate
me@mymachine:~$

При выполнении команды deactivate:

  • Ваше приглашение командной строки изменится с (env1)me@mymachine:~$ обратно на me@mymachine:~$
  • Интерпретатор Python виртуального окружения больше не будет вашим активным Python
  • Переменная окружения PATH будет восстановлена в исходное системное состояние
  • Все переменные окружения, специфичные для виртуального окружения, будут сброшены

Эта команда deactivate автоматически настраивается при активации любого виртуального окружения с помощью virtualenvwrapper, будь то через workon или mkvirtualenv.


Альтернативные подходы

Использование workon без аргументов

Хотя workon в основном используется для переключения между окружениями, вы также можете использовать его для просмотра доступных окружений:

bash
(env1)me@mymachine:~$ workon
Available environments:
  env1
  env2
  default

Однако это не деактивирует текущее окружение — просто перечислит доступные.

Прямое использование deactivate

Команда deactivate работает независимо от того, как вы активировали окружение:

  • Если вы активировали с помощью workon env1
  • Если вы активировали с помощью source /path/to/venv/bin/activate
  • Если вы активировали с помощью mkvirtualenv myenv

Команда во всех случаях одинакова:

bash
(env1)me@mymachine:~$ deactivate
me@mymachine:~$

Создание пользовательской команды

Если вы предпочитаете более явную команду, такую как workon none или exitenv, вы можете создать пользовательскую функцию оболочки. Вот как настроить ее в файле конфигурации вашей оболочки (.bashrc, .zshrc и т.д.):

Вариант 1: Простая функция workon none

bash
workon() {
  # Если аргументы не предоставлены, показать доступные окружения
  if [ $# -eq 0 ]; then
    command workon
  # Если указано "none", деактивировать текущее окружение
  elif [ "$1" = "none" ]; then
    deactivate
  else
    command workon "$@"
  fi
}

Вариант 2: Специальная команда exitenv

bash
exitenv() {
  if [ -n "$VIRTUAL_ENV" ]; then
    deactivate
  else
    echo "Нет активного виртуального окружения"
  fi
}

Вариант 3: Команда workoff

bash
workoff() {
  deactivate
}

Чтобы использовать любую из этих пользовательских функций, добавьте их в файл конфигурации вашей оболочки и либо перезапустите оболочку, либо выполните команду source ~/.bashrc (или эквивалентную).


Работа с несколькими окружениями

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

Переключение между окружениями

bash
# Начнем без активного окружения
me@mymachine:~$ workon env1
(env1)me@mymachine:~$ python --version
Python 3.9.7

# Переключимся на другое окружение
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ python --version
Python 3.8.10

# Вернемся к системному окружению
(env2)me@mymachine:~$ deactivate
me@mymachine:~$ python --version
Python 3.10.6

Проверка текущего окружения

Вы можете проверить, находитесь ли вы в виртуальном окружении, и каком именно:

bash
# Проверить, установлена ли переменная VIRTUAL_ENV
echo $VIRTUAL_ENV
# Вывод: /home/me/.virtualenvs/env1

# Проверить текущий интерпретатор Python
which python
# Вывод: /home/me/.virtualenvs/env1/bin/python

Устранение распространенных проблем

Команда deactivate не найдена

Если вы получаете ошибку “command not found” для deactivate, это обычно означает:

  • Вы на самом деле не находитесь в виртуальном окружении
  • Скрипты запуска вашей оболочки не правильно подключили virtualenvwrapper

Проверьте, что вы находитесь в виртуальном окружении, проверив приглашение командной строки или переменную VIRTUAL_ENV.

Приглашение командной строки не меняется после деактивации

Если ваше приглашение все еще показывает (env1) после выполнения deactivate, попробуйте:

  • Выполнить deactivate еще раз
  • Запустить новый сеанс оболочки
  • Проверить переменную окружения PS1

Переменные окружения сохраняются

Если некоторые переменные окружения остаются установленными после деактивации, вам может потребоваться:

  • Проверить, были ли они установлены в скриптах запуска вашей оболочки
  • Сбросить их вручную: unset MY_VAR

Virtualenvwrapper не правильно установлен

Если у вас постоянно возникают проблемы с командами virtualenvwrapper:

  • Проверьте установку: which workon
  • Убедитесь, что она подключена в файле конфигурации вашей оболочки
  • Убедитесь, что она загружена перед использованием любых команд

Заключение

Чтобы выйти из или деактивировать Python-виртуальное окружение при использовании virtualenvwrapper, просто используйте стандартную команду deactivate. Эта встроенная команда корректно выйдет из вашего виртуального окружения и вернет вас в системное Python-окружение. Вам не нужно создавать пользовательские команды, если вы не предпочитаете более явный интерфейс.

Основные моменты:

  • Используйте deactivate для выхода из любого виртуального окружения
  • Команда работает независимо от того, как вы активировали окружение
  • Ваше приглашение командной строки автоматически обновится, чтобы показать, что вы больше не находитесь в виртуальном окружении
  • Вы можете создавать пользовательские функции, если предпочитаете другие имена команд

Освоив команду deactivate, вы сможете эффективно управлять своими виртуальными окружениями, не выходя и не перезапуская сеанс оболочки.