Jak wyjść / wyjść / dezaktywować virtualenv Pythona

1605

Używam virtualenv i virtualenvwrapper. Mogę przełączać się między virtualenv'em w porządku za pomocąworkon polecenia.

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

Jak wyjść ze wszystkich maszyn wirtualnych i ponownie pracować na mojej prawdziwej maszynie? W tej chwili jedynym sposobem na powrót me@mymachine:~$jest wyjście z powłoki i uruchomienie nowej. To trochę denerwujące. Czy istnieje polecenie pracy nad „niczym”, a jeśli tak, to co to jest? Jeśli takie polecenie nie istnieje, jak miałbym je tworzyć?

Apreche
źródło
5
Istnieje polecenie działania na „nic” - wyświetla wszystkie dostępne środowiska wirtualne, co jest całkiem sprytne. Po prostu wpisz „workon” bez argumentów i naciśnij klawisz Enter. Polecenie „wyjdź” to „dezaktywuj”, zgodnie z odpowiedzią poniżej.
Dannid

Odpowiedzi:

2592

Zwykle aktywacja virtualenv daje funkcję powłoki o nazwie:

$ deactivate

co przywraca normalność.

Właśnie ponownie przyjrzałem się kodowi virtualenvwrapperi tak, on też obsługujedeactivate jako sposób na ucieczkę od wszystkich virtualenvs.

Jeśli próbujesz opuścić środowisko Anaconda , polecenie zależy od wersji conda. Najnowsze wersje (jak 4.6) instalują condafunkcję bezpośrednio w powłoce, w którym to przypadku uruchamiasz:

conda deactivate

Starsze wersje conda zamiast tego implementują dezaktywację za pomocą autonomicznego skryptu:

source deactivate
Brandon Rhodes
źródło
126
Polecenie „dezaktywuj” nie jest plikiem binarnym ani skryptem, który „źródło”; jest to alias powłoki, który jest dynamicznie definiowany w bieżącej powłoce przez skrypt „Activate”.
Brandon Rhodes,
6
@Apreche W międzyczasie (prawie cztery lata później) wydaje się, że zostało to dodane do dokumentacji.
gertvdijk
6
Byłoby o wiele bardziej intuicyjne, gdyby nazwano je „workoff” lub „unworkon”. Lub jeśli „workon” nazwano „aktywuj”. Dzięki Bogu za alias.
kkurian
4
@kkurian - powinieneś zasugerować to w narzędziu do śledzenia problemów virtualenvwrapperi być może Doug Hellmann to rozważy! Uwaga: dla tych, którzy mogą przeczytać te komentarze później, NIEworkon jest to polecenie natywne (o to chodzi w pierwotnym pytaniu), ale polecenie! virtualenvvirtualenvwrapper
Brandon Rhodes,
17
Zgadnij, jak nazywa się rzeczywiste polecenie virtualenv wewnątrz „workon”? ... (ostrzeżenie spoilera) ... ... (ostrzeżenie spoilera) ... ... (ostrzeżenie spoilera) ... ... (ostrzeżenie spoilera) ... aktywuj!
FutureNerd
53

Zdefiniowałem alias , workoff , jako przeciwieństwo workon :

alias workoff='deactivate'

Łatwo jest zapamiętać:

[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$
Bob Stein
źródło
1
W jakim pliku? .bashrc?
seyed
@seyed tak, zobacz odpowiedź na przykład aliasu w~/.bashrc
Bob Stein
21
Podoba mi się ten alias. Przypomina mi Karate Kid (waxon; waxoff)
C0deH4cker
@ C0deH4cker: Zalogowałem się w SO i wróciłem do tego pytania, aby dać +1 Twojemu komentarzowi: p
pooley1994
lol Myślałem (klaskać; klaskać). Myślę, że moglibyśmy również dołączyć (kretyn)
Edison
53

Posługiwać się:

$ deactivate 

Jeśli to nie zadziała, spróbuj

$ source deactivate

Każdy, kto wie, jak działa Bashsource , pomyśli, że to dziwne, ale niektóre owijki / przepływy pracy wokół virtualenv implementują go jako uzupełnienie / odpowiednik source activate. Twój przebieg może się różnić.

DarkRider
źródło
7
deactivateto funkcja, która jest tworzona podczas źródła activatepliku. Twoja sugestia, aby to zrobić, source deactivatenie ma żadnego sensu, ponieważ nie ma pliku o nazwiedeactivate
Anthon
7
To nie zasługuje na opinie. Zobacz edycję wybranej odpowiedzi: dezaktywacja źródła dotyczy środowiska anakondy.
Doug Bradshaw,
2
„Zasługuje” na głosowanie za niespełnianie standardów jakości odpowiedzi SO . To bardziej komentarz niż odpowiedź. Ale z powodu 79 reputacji plakatu powinniśmy być mili i dawać dobre opinie.
Bruno Bronosky,
@Abdul Pokazałem, jak można poprawić jakość odpowiedzi w wersji 2 na stackoverflow.com/posts/29586756/revisions
Bruno Bronosky
jest to bardzo nieprzydatne, jeśli nie masz polecenia dezaktywacji w swojej powłoce. Naprawdę nie rozumiem, dlaczego to pomogło. W wirtualnej env nie ma skryptu dezaktywującego.
bgenchel
19

Aby aktywować środowisko wirtualne Python:

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

Aby dezaktywować:

$deactivate
Amitesh Ranjan
źródło
3
W terminalu w systemie OS X10.11.1 wydaje się, że muszę użyć:$source activate
Eric Milliot-Martinez,
Nie potrzebowałem źródła. Zrobiłem $cd /to/dir/i/want/my/virtualenv/installedwtedy, $virtualenv name_i_want_for_ita $. name_i_want_for_it/bin/activatevirtualenv nadal wydaje mi się trochę off.
Trzeba
3
„źródło” jest takie samo jak „.” polecenie .. albo można użyć do źródła pliku
Corey Goldberg
11

Odkryłem, że będąc w środowisku Miniconda3 musiałem uruchomić:

conda deactivate

Ani dla mnie deactivatenie source deactivatedziałał.

CephBirk
źródło
1
deactivatebył dla starej Linuksa virtualenvi source deactivatejest dla starej. conda deactivatejest dobrym, wieloplatformowym sposobem dla conda envs (nie virtualenvs)
Tomasz Gandor
6

Możesz użyć virtualenvwrapper, aby ułatwić sobie pracę virtualenv.

Instalowanie virtualenvwrapper:

pip install virtualenvwrapper

Jeśli używasz standardowej powłoki, otwórz swoją ~/.bashrclub ~/.zshrcjeśli używasz Oh My Zsh . Dodaj te dwie linie:

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

Aby aktywować istniejące virtualenv, użyj polecenia workon:

$ workon myenv
(myenv)$

Aby dezaktywować virtualenv:

(myenv)$ deactivate

Oto mój samouczek krok po kroku, jak zainstalować virtualenv i virtualenvwrapper.

Levi
źródło
2
Widzę niewielką różnicę w porównaniu do wbudowanego virtualenv
Nam G VU
1
@NamGVU Zwróć uwagę na workonpolecenie, działa ono z dowolnego katalogu.
igaurav
1
Jak wspomniano w komentarzu do innego postu (a Stackoverflow nie ma praktycznego sposobu na wskazanie go), nie można używać deactivatew skrypcie powłoki bez wcześniejszego wyszukania skryptu, który definiuje tę funkcję (w takim przypadku nie będzie można znaleźć tego polecenia. . error)
Mariano Ruiz
4

Ponieważ deactivatefunkcji utworzonej przez sourcing ~/bin/activatenie można odkryć zwykłymi metodami szukania takiej komendy ~/bin, możesz chcieć utworzyć taką, która po prostu wykonuje funkcjędeactivate .

Problem polega na tym, że skrypt o nazwie deactivatezawierający jedno poleceniedeactivate spowoduje nieskończoną pętlę, jeśli zostanie przypadkowo wykonany, gdy nie będzie w venv. Powszechny błąd.

Można tego uniknąć, wykonując tylko deactivatewtedy, gdy funkcja istnieje (tzn. Została utworzona przez sourcing activate).

#!/bin/bash

declare -Ff deactivate  && deactivate
DocSalvager
źródło
3

Zastosowanie deactivate.

(my_env) user@user:~/my_env$ deactivate
user@user-Lenovo-E40-80:~/my_env$ 

Uwaga, (my_env)nie ma.

Podstawowe zasady
źródło
2

Używam zsh-autoenv, który jest oparty na autoenv .

zsh-autoenv automatycznie źródło (znane / biała lista) .autoenv.zshplików, zwykle używane w katalogach głównych projektu. Obsługuje zdarzenia „wchodzić” i wychodzić, zagnieżdżanie i ukrywanie zmiennych (nadpisywanie i przywracanie).

Oto przykład:

; 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

Więc kiedy opuszczę dtree katalog, środowisko wirtualne jest automatycznie zamykane.

"Development tree utiles" to tylko nazwa… Żadne ukryte znaczenie nie prowadzi do iluminatów tutaj.

Sardathrion - przeciw nadużyciom SE
źródło
1

Korzystanie z deactivatefunkcji dostarczonej przez activateskrypt venv wymaga, aby funkcja dezaktywacji została poprawnie zakodowana w celu czystego zresetowania wszystkich zmiennych środowiskowych do poprzedniego stanu - biorąc pod uwagę nie tylko oryginalną aktywację , ale także wszelkie przełączniki , konfigurację lub inne praca, którą mogłeś w międzyczasie wykonać.

Prawdopodobnie jest w porządku, ale wprowadza nowe niezerowe ryzyko, że środowisko zostanie zmodyfikowane później.

Jednak nie jest technicznie możliwe, aby proces bezpośrednio zmieniał zmienne środowiskowe swojego rodzica, więc możemy użyć oddzielnej podpowłoki, aby mieć absolutną pewność, że nasze venvnie pozostawiają żadnych resztkowych zmian:


Aktywować:

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

  • To uruchamia nową powłokę wokół venv. Twoja oryginalna bashpowłoka pozostaje niezmodyfikowana.

Aby dezaktywować:

$ exitLUB [CTRL]+[D]

  • Spowoduje to zamknięcie całej powłoki, w której się venvznajduje, i powrót do oryginalnej powłoki sprzed skryptu aktywacyjnego, który wprowadził jakiekolwiek zmiany w środowisku.

Przykład:

[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!
Will Chen
źródło
-1

Miałem ten sam problem podczas pracy nad skryptem instalatora. Rzuciłem okiem na to, co bin / Activ_this.py zrobił i odwróciłem to.

Przykład:

#! /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())

Nie jestem w 100% pewien, czy działa zgodnie z przeznaczeniem. Mogłem coś całkowicie przeoczyć.

Lord Sumner
źródło
2
jeśli dezaktywacja resetuje wartość ścieżki środowiska, ścieżki systemowej, domyślnego monitu, wówczas funkcja dezaktywacji jest dobrym podejściem. Podoba mi się twój skrypt. Dano już +1.
Ramkumar D