Come uscire / uscire / disattivare un virtualenv Python


1607

Sto usando virtualenv e virtualenvwrapper. Posso passare da virtualenv alla perfezione usando il workoncomando.

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

Come posso uscire da tutte le macchine virtuali e lavorare di nuovo sulla mia macchina reale? In questo momento, l'unico modo in cui devo tornare me@mymachine:~$è uscire dalla shell e avviarne una nuova. È un po 'fastidioso. Esiste un comando per lavorare su "niente" e, in caso affermativo, che cos'è? Se un tale comando non esiste, come potrei fare per crearlo?


5
Esiste un comando per lavorare su "niente": visualizza tutti gli ambienti virtuali disponibili, il che è piuttosto ingegnoso. Digita "workon" senza argomenti e premi invio. Il comando per uscire è "disattivare", come indicato di seguito.
Dannid,

Risposte:


2595

Di solito, l'attivazione di virtualenv ti dà una funzione di shell chiamata:

$ deactivate

che riporta le cose alla normalità.

Ho appena esaminato in modo specifico il codice per virtualenvwrapper, e, sì, supporta anche deactivatecome il modo per sfuggire a tutti i virtual virtual.

Se stai cercando di lasciare un ambiente Anaconda , il comando dipende dalla tua versione di conda. Le versioni recenti (come 4.6) installano una condafunzione direttamente nella tua shell, nel qual caso esegui:

conda deactivate

Le versioni conda precedenti invece implementano la disattivazione utilizzando uno script autonomo:

source deactivate

126
Il comando "disattiva" non è un file binario, né uno script che "fonte"; è un alias di shell che viene definito dinamicamente nella shell corrente dallo script "activate".
Brandon Rhodes,

6
@Apreche Nel frattempo (quasi quattro anni dopo) questo sembra essere stato aggiunto alla documentazione.
gertvdijk,

6
Sarebbe molto più intuitivo se fosse chiamato "workoff" o "unworkon". O se "workon" fosse chiamato "attivare". Grazie al cielo per alias.
kkurian,

4
@kkurian - dovresti suggerire che sul tracker del problema per virtualenvwrappere forse Doug Hellmann lo prenderebbe in considerazione! Nota, per coloro che potrebbero leggere questi commenti in seguito, NONworkon è un comando nativo (che è la domanda originale) ma un comando! virtualenvvirtualenvwrapper
Brandon Rhodes,

17
Indovina come si chiama l'attuale comando virtualenv all'interno di "workon"? ... (avviso spoiler) ... ... (avviso spoiler) ... ... (avviso spoiler) ... ... (avviso spoiler) ... attivare!
FutureNerd

53

Ho definito un alias , workoff , come l'opposto di workon :

alias workoff='deactivate'

È facile da ricordare:

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

1
In quale file? .bashrc?
visto l'

@seyed sì, vedi questa risposta per un esempio di alias in~/.bashrc
Bob Stein

21
Mi piace questo alias. Mi ricorda il Karate Kid (waxon; waxoff)
C0deH4cker

@ C0deH4cker: ho effettuato l'accesso a SO e sono tornato a questa domanda solo per fare +1 sul tuo commento: p
pooley1994

lol stavo pensando (clap-on; clap-off). Immagino che potremmo anche includere (coglione--)
Edison il

53

Uso:

$ deactivate 

Se questo non funziona, prova

$ source deactivate

Chiunque sappia come funziona Bashsource penserà che è strano, ma alcuni wrapper / flussi di lavoro attorno a virtualenv lo implementano come complemento / controparte source activate. Il tuo chilometraggio può variare.


7
deactivateè una funzione che viene creata durante l'origine del activatefile. Il tuo suggerimento da fare source deactivatenon ha alcun senso, in quanto non esiste alcun file denominatodeactivate
Anthon,

7
Questo non merita i voti negativi. Vedi modifica della risposta selezionata: la sorgente di disattivazione è per l'ambiente anaconda.
Doug Bradshaw,

2
"Merita" i voti negativi per non aver rispettato gli standard di qualità della risposta SO . È più un commento che una risposta. Ma, a causa della 79 reputazione del poster, dovremmo essere gentili e dare un buon feedback.
Bruno Bronosky,

@Abdul ho dimostrato come è possibile migliorare la qualità risposta nella revisione 2 a stackoverflow.com/posts/29586756/revisions
Bruno Bronosky

questo è molto inutile se non hai un comando di disattivazione nella tua shell. Non capisco davvero perché questo aiuterebbe il problema. Non esiste uno script di disattivazione nell'ambiente virtuale.
bgenchel,

19

Per attivare un ambiente virtuale Python:

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

Per disattivare:

$deactivate

3
Nel terminale su OS X10.11.1, mi sembra di dover usare:$source activate
Eric Milliot-Martinez il

Non avevo bisogno della fonte. Ho fatto $cd /to/dir/i/want/my/virtualenv/installedallora $virtualenv name_i_want_for_itallora $. name_i_want_for_it/bin/activatevirtualenv sembra ancora un po 'fuori di me.
Deve

3
"source" è uguale a "." Il comando .. può essere usato per generare un file
Corey Goldberg

11

Ho scoperto che in un ambiente Miniconda3 dovevo eseguire:

conda deactivate

deactivatesource deactivatelavorato per me.


1
deactivateera per virtualenved source deactivateè per vecchio conda su Linux. conda deactivateè un buon modo multipiattaforma per conda envs (non virtualenvs)
Tomasz Gandor

6

Puoi usarlo virtualenvwrapperper facilitare il tuo modo di lavorare virtualenv.

Installazione virtualenvwrapper:

pip install virtualenvwrapper

Se stai usando una shell standard, apri il tuo ~/.bashrco ~/.zshrcse usi Oh My Zsh . Aggiungi queste due righe:

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

Per attivare un virtualenv esistente, utilizzare il comando workon:

$ workon myenv
(myenv)$

Per disattivare virtualenv:

(myenv)$ deactivate

Ecco il mio tutorial , passo dopo passo su come installare virtualenv e virtualenvwrapper.


2
Vedo poca differenza rispetto a virtualenv integrato
Nam G VU

1
@NamGVU Notare il workoncomando, funziona da qualsiasi directory.
igaurav,

1
Come accennato nel commento di un altro post (e StackOverflow non ha un modo pratico di indicarlo) non è possibile utilizzare deactivatein uno script di shell senza prima approvare lo script che definisce questa funzione (in tal caso non si troverà quel comando .. . errore)
Mariano Ruiz

4

Poiché la deactivatefunzione creata dall'approvvigionamento ~/bin/activatenon può essere scoperta con i soliti mezzi di ricerca di tale comando ~/bin, è possibile crearne uno che esegua semplicemente la funzione deactivate.

Il problema è che uno script chiamato deactivatecontenente un singolo comando deactivateprovocherà un ciclo infinito se eseguito accidentalmente mentre non si trova nella venv. Un errore comune

Questo può essere evitato solo eseguendo deactivatese la funzione esiste (cioè è stata creata tramite sourcing activate).

#!/bin/bash

declare -Ff deactivate  && deactivate

3

Usa deactivate.

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

Nota, non (my_env)c'è più.


2

Uso zsh-autoenv che si basa su autoenv .

zsh-autoenv genera automaticamente i file (noti / autorizzati) .autoenv.zsh, generalmente utilizzati nelle directory root del progetto. Gestisce "entra" e lascia "eventi, annidamento e memorizzazione di variabili (sovrascrittura e ripristino).

Ecco un esempio:

; 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

Quindi quando esco dalla dtreedirectory, l'ambiente virtuale esce automaticamente.

"Development tree utiles" è solo un nome ... Nessun mezzo nascosto che collega agli Illuminati qui.


1

L'utilizzo della deactivatefunzionalità fornita dallo activatescript di venv richiede che la funzione di disattivazione sia opportunamente codificata per reimpostare in modo pulito tutte le variabili di ambiente su come erano prima, tenendo conto non solo dell'attivazione originale , ma anche di qualsiasi opzione , configurazione o altro lavoro che potresti aver fatto nel frattempo.

Probabilmente va bene, ma introduce un nuovo rischio diverso da zero di lasciare il tuo ambiente modificato in seguito.

Tuttavia, non è tecnicamente possibile per un processo alterare direttamente le variabili di ambiente del suo genitore, quindi possiamo usare una sotto-shell separata per essere assolutamente sicuri che i nostri venvs non lascino indietro eventuali modifiche residue:


Attivare:

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

  • Questo avvia una nuova shell attorno al venv. La tua bashshell originale rimane non modificata.

Per disattivare:

$ exitOPPURE [CTRL]+[D]

  • Questo esce dall'intera shell in cui si venvtrova e ti riporta alla shell originale prima che lo script di attivazione apportasse modifiche all'ambiente.

Esempio:

[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

Ho avuto lo stesso problema mentre lavoravo su uno script di installazione. Ho dato un'occhiata a cosa ha fatto bin / activ_this.py e l'ho invertito.

Esempio:

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

Non sono sicuro al 100% se funziona come previsto. Potrei essermi perso qualcosa completamente.


2
se disattivazione ripristina il valore del percorso ambiente, percorso di sistema, prompt predefinito, la funzione di disattivazione è un buon approccio. Mi piace la tua sceneggiatura. Già dato +1.
Ramkumar D
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.