Як залишити / вийти / відключити віртуол Python


1605

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

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

Як вийти з усіх віртуальних машин і знову працювати на своїй реальній машині? Зараз єдиний спосіб повернутися до мене me@mymachine:~$- це вийти з оболонки та запустити новий. Це щось дратує. Чи є команда працювати над «нічого», і якщо так, то що це? Якщо такої команди не існує, як би я почав її створювати?


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

Відповіді:


2592

Зазвичай активація virtualenv надає функцію оболонки з назвою:

$ deactivate

що приводить речі в норму.

Я тільки що ще раз спеціально переглянув код для virtualenvwrapper, і, так, він занадто підтримує, deactivateяк спосіб врятуватися від усіх віртуалів.

Якщо ви намагаєтеся залишити середовище Anaconda , команда залежить від вашої версії conda. Останні версії (як-от 4.6) встановлюють condaфункцію безпосередньо у вашій оболонці; у цьому випадку ви запускаєте:

conda deactivate

Старіші версії conda замість цього реалізують деактивацію за допомогою автономного сценарію:

source deactivate

126
Команда «деактивувати» не є двійковим або скриптом, який ви «джерелом»; це псевдонім оболонки, який динамічно визначається у вашій поточній оболонці за допомогою сценарію «активувати».
Брендон Родос

6
@Apreche Тим часом (майже через чотири роки) це, здається, було додано до документації.
gertvdijk

6
Було б набагато інтуїтивніше, якби його називали "роботодавцем" або "непрацелюбним". Або якщо "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
Мені подобається цей псевдонім. Нагадує мені про малечу карате (воск; воск)
C0deH4cker

@ C0deH4cker: Я ввійшов у програму SO і повернувся до цього питання, щоб просто поставити +1 вашому коментарю: p
pooley1994

lol я думав (clap-on; хлопати). Я думаю, ми могли б також включити (ривок--)
Едісон

53

Використання:

$ deactivate 

Якщо це не працює, спробуйте

$ source deactivate

Кожен, хто знає, як працює Bashsource , подумає, що це дивно, але деякі обгортки / робочі потоки навколо virtualenv реалізують це як доповнення / контрагента source activate. Ваш пробіг може відрізнятися.


7
deactivateце функція, яка створюється під час джерела activateфайлу. Ваша пропозиція робити source deactivateзовсім не має сенсу, оскільки не існує файлу з ім’ямdeactivate
Антон

7
Цього не заслуговує протистояння. Див. Редагування вибраної відповіді: джерело дезактивації призначене для середовища анаконда.
Doug Bradshaw

2
Він "заслуговує" на те, щоб не відповідати стандартам якості відповіді на якість. Це скоріше коментар, ніж відповідь. Але, завдяки 79 репутації афіші, ми повинні бути приємні та дати хороші відгуки.
Бруно Броноський

@Abdul я продемонстрував , як можна поліпшити якість відповідей в Revision 2 в stackoverflow.com/posts/29586756/revisions
Бруно Bronosky

це дуже не допомагає, якщо у вашій оболонці немає команди дезактивації. Я не дуже розумію, чому це допоможе проблемі. У віртуальній середовищі відсутній сценарій деактивації.
bgenchel

19

Щоб активувати віртуальне середовище Python:

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

Щоб вимкнути:

$deactivate

3
У терміналі на ОС 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 все ще здається мені трохи відключеним. Потрібно покращити ...
uchuugaka

3
"джерело" те саме, що "." Команда .. або можна використовувати для джерела файлу
Corey Goldberg

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команду, вона працює з будь-якого каталогу.
igaurav

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вимагає довірити правильності кодування функції дезактивації, щоб чітко скинути всі змінні середовища назад до того, як вони були раніше - з урахуванням не тільки оригінальної активації , але й будь-яких комутаторів , конфігурації чи іншого робота, яку ви, можливо, зробили тим часом.

Це, мабуть, добре, але це вводить новий, ненульовий ризик залишати своє оточення зміненим згодом.

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


Щоб активувати:

$ 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 / activate_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.
Рамкумар D
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.