Как выйти / выйти / отключить Python virtualenv


1607

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

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

Как мне выйти из всех виртуальных машин и снова работать на моей реальной машине? Прямо сейчас единственный способ вернуться к нему me@mymachine:~$- выйти из оболочки и запустить новый. Это немного раздражает. Есть ли команда для работы над «ничем», и если да, то что это? Если такой команды не существует, как бы я ее создал?


5
Есть команда для работы с «ничем» - она ​​отображает все ваши доступные виртуальные среды, что довольно изящно. Просто введите «workon» без аргументов и нажмите Enter. Команда для выхода - «деактивировать», как показано ниже.
Даннид

Ответы:


2596

Обычно, активируя virtualenv, вы получаете функцию оболочки с именем:

$ deactivate

что возвращает вещи в норму.

Я только что специально посмотрел на код для virtualenvwrapper, и, да, он тоже поддерживает deactivateкак способ убежать от всех virtualenvs.

Если вы пытаетесь покинуть среду Anaconda , команда зависит от вашей версии conda. Последние версии (например, 4.6) устанавливают condaфункцию прямо в вашей оболочке, в этом случае вы запускаете:

conda deactivate

Старые версии conda вместо этого реализуют деактивацию с помощью автономного скрипта:

source deactivate

126
Команда «деактивировать» не является ни двоичным файлом, ни сценарием, который вы «используете»; это псевдоним оболочки, который динамически определяется в вашей текущей оболочке скриптом «активации».
Брэндон Родс

6
@Apreche Тем временем (почти четыре года спустя) это, кажется, было добавлено к документации.
gertvdijk

6
Было бы гораздо более интуитивно понятным, если бы это называлось "Workoff" или "Unworkon". Или если «workon» назывался «активировать». Слава Богу за псевдоним.
kkurian

4
@kkurian - вы должны предложить, чтобы на проблемном трекере для virtualenvwrapperи, возможно, Даг Хеллманн рассмотрел бы это! Обратите внимание, для тех , кто может читать эти комментарии позже, что workonэто НЕ родной virtualenvкоманды (что исходный вопрос о) , но virtualenvwrapperкоманда!
Брэндон Роудс

17
Угадайте, как называется действительная команда virtualenv внутри «workon»? ... (предупреждение о спойлере) ... ... (предупреждение о спойлере) ... ... (предупреждение о спойлере) ... ... (предупреждение о спойлере) ... активировать!
FutureNerd

53

Я определил псевдоним , workoff , как противоположность workon :

alias workoff='deactivate'

Это легко запомнить:

[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$

1
В каком файле? .bashrc?
Сейед

@seyed да, см. этот ответ для примера псевдонима в~/.bashrc
Боб Стейн

21
Мне нравится этот псевдоним. Напоминает мне о ребенке-каратэ (waxon; waxoff)
C0deH4cker

@ C0deH4cker: Я вошел в SO и вернулся к этому вопросу только для того, чтобы +1
добавить

LOL я думал (хлопать-хлопать-хлопать). Я думаю, мы могли бы также включить (рывок)
Эдисон

53

Использование:

$ deactivate 

Если это не работает, попробуйте

$ source deactivate

Любой, кто знает, как работает Bashsource , подумает, что это странно, но некоторые оболочки / рабочие процессы вокруг virtualenv реализуют его как дополнение / аналог source activate. Ваш пробег может варьироваться.


7
deactivateэто функция, которая создается при исходном activateфайле. Ваше предложение сделать source deactivateне имеет никакого смысла, так как нет файла с именемdeactivate
Anthon

7
Это не заслуживает отрицательных голосов. См. Редактирование выбранного ответа: источник деактивирован для среды анаконды.
Даг Брэдшоу

2
Он «заслуживает» downvotes для не отвечающего SO ответа стандартов качества. Это скорее комментарий, чем ответ. Но из-за репутации постера мы должны быть милыми и давать хорошие отзывы.
Бруно Броноски

@Abdul Я продемонстрировал, как вы можете улучшить качество ответов в редакции 2, на stackoverflow.com/posts/29586756/revisions
Бруно Броноски,

это очень бесполезно, если в вашей оболочке нет команды деактивации. Я не очень понимаю, почему это поможет решить проблему. В виртуальной среде нет сценария деактивации.
Bgenchel

19

Чтобы активировать виртуальную среду Python:

$cd ~/python-venv/
$./bin/activate

Чтобы деактивировать:

$deactivate

3
В терминале на OS X10.11.1 я, кажется, должен использовать:$source activate
Эрик Миллиот-Мартинес

Мне не нужен источник. Я сделал $cd /to/dir/i/want/my/virtualenv/installedто $virtualenv name_i_want_for_itтогда $. name_i_want_for_it/bin/activatevirtualenv все еще кажется , немного не ко мне.
Нужно

3
«источник» совпадает с «.» команда .. любой может быть использован для получения файла
Кори Голдберг

11

Я обнаружил, что в среде Miniconda3 мне нужно было запустить:

conda deactivate

Ни у меня, deactivateни source deactivateу меня не получалось.


1
deactivateбыл для virtualenv, и source deactivateдля старой Конды на Linux. conda deactivateхороший кроссплатформенный способ для conda envs (не virtualenvs)
Томаш Гандор

6

Вы можете использовать virtualenvwrapper, чтобы облегчить работу virtualenv.

Установка virtualenvwrapper:

pip install virtualenvwrapper

Если вы используете стандартную оболочку, откройте ~/.bashrcили, ~/.zshrcесли вы используете Oh My Zsh . Добавьте эти две строки:

export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

Чтобы активировать существующий virtualenv, используйте команду workon:

$ workon myenv
(myenv)$

Для того, чтобы деактивировать ваше virtualenv:

(myenv)$ deactivate

Вот мой учебник , шаг за шагом о том, как установить virtualenv и virtualenvwrapper.


2
Я вижу небольшую разницу по сравнению со встроенным virtualenv
Nam G VU

1
@NamGVU Обратите внимание на workonкоманду, она работает из любого каталога.
Игаурав

1
Как упомянуто в комментарии другого поста (а Stackoverflow не имеет практического способа указать на него), вы не можете использовать deactivateв сценарии оболочки без предварительного поиска сценария, который определяет эту функцию (в этом случае у вас будет эта команда не найдена). . ошибка)
Mariano Ruiz

4

Поскольку deactivateфункция, созданная с помощью источника, ~/bin/activateне может быть обнаружена обычными средствами поиска такой команды ~/bin, вы можете создать такую, которая просто выполняет функцию deactivate.

Проблема в том, что скрипт с именем deactivateсодержит одну командуdeactivate , вызовет бесконечный цикл, если он будет случайно выполнен, когда он не находится в venv. Распространенная ошибка.

Этого можно избежать, только выполнив, deactivateесли функция существует (то есть была создана с помощью источника activate).

#!/bin/bash

declare -Ff deactivate  && deactivate


2

Я использую zsh-autoenv, который основан на autoenv .

zsh-autoenv автоматически получает файлы (известные / в белый список) .autoenv.zsh, которые обычно используются в корневых каталогах проекта. Он обрабатывает события «вход» и «выход», вложение и сохранение переменных (перезапись и восстановление).

Вот пример:

; cd dtree 
Switching to virtual environment: Development tree utiles
;dtree(feature/task24|✓); cat .autoenv.zsh       
# Autoenv.
echo -n "Switching to virtual environment: "
printf "\e[38;5;93m%s\e[0m\n" "Development tree utiles"
workon dtree
# eof
dtree(feature/task24|✓); cat .autoenv_leave.zsh 
deactivate

Поэтому, когда я покидаю dtreeкаталог, виртуальная среда автоматически закрывается.

"Development tree utiles" это просто имя ... Никакой скрытой ссылки на иллюминатов здесь.


1

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

Это, вероятно, хорошо, но это вносит новый ненулевой риск оставить вашу среду измененной впоследствии.

Однако технически невозможно, чтобы процесс напрямую изменил переменные окружения своего родителя, поэтому мы можем использовать отдельную вложенную оболочку, чтобы быть абсолютно уверенными, что наши venvs не оставляют никаких остаточных изменений:


Активировать:

$ bash --init-file PythonVenv/bin/activate

  • Это начинает новую оболочку вокруг venv. Ваша оригинальная bashоболочка остается неизменной.

Чтобы деактивировать:

$ exitИЛИ [CTRL]+[D]

  • Это завершает работу всей оболочки venvи возвращает вас к исходной оболочке до того, как скрипт активации внесет какие-либо изменения в среду.

Пример:

[user@computer ~]$ echo $VIRTUAL_ENV
No virtualenv!

[user@computer ~]$ bash --init-file PythonVenv/bin/activate

(PythonVenv) [user@computer ~]$ echo $VIRTUAL_ENV
/home/user/PythonVenv

(PythonVenv) [user@computer ~]$ exit
exit

[user@computer ~]$ echo $VIRTUAL_ENV
No virtualenv!

-1

У меня была такая же проблема при работе над установочным скриптом. Я взглянул на то, что сделал bin / activ_this.py , и перевернул его.

Пример:

#! /usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys

# Path to virtualenv
venv_path = os.path.join('/home', 'sixdays', '.virtualenvs', 'test32')

# Save old values
old_os_path = os.environ['PATH']
old_sys_path = list(sys.path)
old_sys_prefix = sys.prefix


def deactivate():
    # Change back by setting values to starting values
    os.environ['PATH'] = old_os_path
    sys.prefix = old_sys_prefix
    sys.path[:0] = old_sys_path


# Activate the virtualenvironment
activate_this = os.path.join(venv_path, 'bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))


# Print list of pip packages for virtualenv for example purpose
import pip
print str(pip.get_installed_distributions())

# Unload pip module
del pip

# Deactivate/switch back to initial interpreter
deactivate()

# Print list of initial environment pip packages for example purpose
import pip
print str(pip.get_installed_distributions())

Я не уверен на 100%, работает ли он так, как задумано. Возможно, я что-то пропустил полностью.


2
если деактивация сбрасывает значение пути среды, системного пути, приглашения по умолчанию, тогда ваша функция деактивации - хороший подход. Мне нравится твой сценарий. Уже дано +1.
Рамкумар Д
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.