Como deixar / sair / desativar um virtualenv do Python

1607

Estou usando o virtualenv e o virtualenvwrapper. Eu posso alternar entre virtualenv's muito bem usando o workoncomando

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

Como saio de todas as máquinas virtuais e trabalho na minha máquina real novamente? No momento, a única maneira de voltar ao assunto me@mymachine:~$é sair do shell e iniciar um novo. Isso é meio chato. Existe um comando para trabalhar em "nada" e, em caso afirmativo, o que é? Se esse comando não existir, como eu o crio?

Apreche
fonte
5
Existe um comando para trabalhar em "nada" - ele exibe todos os seus ambientes virtuais disponíveis, o que é bastante bacana. Basta digitar "workon" sem argumentos e pressionar enter. O comando para sair é "desativar", conforme respondido abaixo.
Dannid

Respostas:

2595

Geralmente, ativar um virtualenv fornece uma função de shell chamada:

$ deactivate

o que coloca as coisas de volta ao normal.

Acabei de olhar especificamente novamente para o código virtualenvwrappere, sim, ele também suporta deactivatecomo a maneira de escapar de todos os virtualenvs.

Se você está tentando sair de um ambiente Anaconda , o comando depende da sua versão do conda. Versões recentes (como 4.6) instalam uma condafunção diretamente no seu shell; nesse caso, você executa:

conda deactivate

Em vez disso, versões mais antigas de conda implementam a desativação usando um script independente:

source deactivate
Brandon Rhodes
fonte
126
O comando “desativar” não é um binário, nem um script que você “origina”; é um alias do shell que é definido dinamicamente no seu shell atual pelo script "ativar".
Brandon Rhodes
6
Enquanto isso (quase quatro anos depois), parece que isso foi adicionado à documentação.
gertvdijk
6
Seria muito mais intuitivo se fosse chamado "workoff" ou "unworkon". Ou se "workon" fosse chamado de "ativar". Graças a Deus pelo apelido.
kkurian
4
@kkurian - você deveria sugerir que, no rastreador de questões, virtualenvwrappere talvez Doug Hellmann o considerasse! Observe que, para aqueles que podem ler esses comentários mais tarde, esse NÃOworkon é um comando nativo (que é o objetivo da pergunta original), mas um comando! virtualenvvirtualenvwrapper
Brandon Rhodes
17
Adivinhe como é chamado o comando virtualenv real dentro de "workon"? ... (aviso de spoiler) ... ... (aviso de spoiler) ... ... (aviso de spoiler) ... ... (aviso de spoiler) ... ativar!
FutureNerd
53

Eu defini um alias , workoff , como o oposto de workon :

alias workoff='deactivate'

É fácil lembrar:

[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$
Bob Stein
fonte
1
Em qual arquivo? .bashrc?
costurado
@seyed sim, veja esta resposta para um exemplo de pseudônimo em~/.bashrc
Bob Stein
21
Eu gosto desse apelido. Lembra-me do Karate Kid (waxon; waxoff)
C0deH4cker
@ C0deH4cker: Entrei no SO e voltei a esta pergunta apenas com +1 seu comentário: p
pooley1994
lol eu estava pensando (aplauso; aplauso). Acho que também poderíamos incluir (idiota--)
Edison
53

Usar:

$ deactivate 

Se isso não funcionar, tente

$ source deactivate

Qualquer um que saiba como o Bashsource funciona achará estranho, mas alguns wrappers / fluxos de trabalho em torno do virtualenv o implementam como complemento / contraparte source activate. Sua milhagem pode variar.

DarkRider
fonte
7
deactivateé uma função criada quando você origina o activatearquivo. Sua sugestão a fazer source deactivatenão faz sentido em tudo, como não há nenhum arquivo chamadodeactivate
Anthon
7
Isso não merece os votos negativos. Consulte a edição da resposta selecionada: a desativação da fonte é para o ambiente anaconda.
Doug Bradshaw
2
Ele "merece" votos negativos por não atender aos padrões de qualidade da resposta do SO . É mais um comentário do que uma resposta. Mas, devido à reputação do pôster, devemos ser agradáveis ​​e dar um bom feedback.
de Bruno Bronosky
@Abdul eu demonstrei como você pode melhorar a sua qualidade de resposta na Revisão 2 em stackoverflow.com/posts/29586756/revisions
de Bruno Bronosky
isso é muito inútil se você não tiver um comando de desativação no seu shell. Realmente não entendo por que isso ajudaria no problema. Não há script desativado no ambiente virtual.
bgenchel
19

Para ativar um ambiente virtual Python:

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

Para desativar:

$deactivate
Amitesh Ranjan
fonte
3
No terminal do OS X10.11.1, eu pareço ter que usar:$source activate
Eric Milliot-Martinez 5/15/15
Eu não precisava de fonte. Fiz $cd /to/dir/i/want/my/virtualenv/installed, então $virtualenv name_i_want_for_it, em seguida, $. name_i_want_for_it/bin/activatevirtualenv ainda parece um pouco fora para mim. Precisa ser melhorado ...
uchuugaka
3
"origem" é o mesmo que "." comando .. pode ser usado para obter um arquivo de origem
Corey Goldberg
11

Eu descobri que quando em um ambiente Miniconda3 eu tinha que executar:

conda deactivate

Nem deactivatenem source deactivatetrabalhou para mim.

CephBirk
fonte
1
deactivatefoi para virtualenv, e source deactivateé para antigo condado no Linux. conda deactivateé uma boa maneira multiplataforma para envs de conda (não virtualenvs)
Tomasz Gandor
6

Você pode usar virtualenvwrapperpara facilitar a maneira como trabalha virtualenv.

Instalando virtualenvwrapper:

pip install virtualenvwrapper

Se você estiver usando um shell padrão, abra seu ~/.bashrcou ~/.zshrcse você usa Oh My Zsh . Adicione estas duas linhas:

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

Para ativar um virtualenv existente, use o comando workon:

$ workon myenv
(myenv)$

Para desativar seu virtualenv:

(myenv)$ deactivate

Aqui está o meu tutorial , passo a passo sobre como instalar o virtualenv e o virtualenvwrapper.

levi
fonte
2
Vejo pouca diferença em comparação com built-in virtualenv
Nam G VU
1
@NamGVU Observe o workoncomando, ele funciona em qualquer diretório.
Izurav # 28/16
1
Conforme mencionado no comentário de outra postagem (e o Stackoverflow não tem uma maneira prática de apontar para ele), você não pode usar deactivateem um script shell sem primeiro procurar o script que define essa função (nesse caso, você terá esse comando não será encontrado .. . erro)
Mariano Ruiz
4

Como a deactivatefunção criada pelo sourcing ~/bin/activatenão pode ser descoberta pelos meios usuais de procura de um comando desse tipo ~/bin, convém criar um que apenas execute a função deactivate.

O problema é que um script chamado deactivatecontendo um único comando deactivatecausará um loop infinito se for executado acidentalmente enquanto não estiver no venv. Um erro comum.

Isso pode ser evitado executando apenas deactivatese a função existir (isto é, foi criada pelo sourcing activate).

#!/bin/bash

declare -Ff deactivate  && deactivate
DocSalvager
fonte
3

Use deactivate.

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

Nota, (my_env)se foi.

Regras Basantes
fonte
2

Eu uso o zsh-autoenv, que é baseado no autoenv .

O zsh-autoenv origina automaticamente arquivos (conhecidos / incluídos na lista de permissões) .autoenv.zsh, normalmente usados ​​nos diretórios raiz do projeto. Ele lida com "entrar" e deixar "eventos, aninhamento e armazenamento de variáveis ​​(sobrescrevendo e restaurando).

Aqui está um exemplo:

; 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

Portanto, quando saio do dtreediretório, o ambiente virtual é encerrado automaticamente.

"Development tree utiles" é apenas um nome ... Não há nenhum meio oculto de ligação aos Illuminati aqui.

Sardathrion - contra o abuso de SE
fonte
1

O uso do deactivaterecurso fornecido pelo activatescript do venv exige que você confie na função de desativação para ser codificada corretamente para redefinir de forma limpa todas as variáveis ​​de ambiente, como eram antes - levando em consideração não apenas a ativação original , mas também quaisquer opções , configurações ou outras opções . trabalho que você pode ter feito enquanto isso.

Provavelmente está bem, mas apresenta um risco novo e diferente de deixar seu ambiente modificado posteriormente.

No entanto, não é tecnicamente possível para um processo alterar diretamente as variáveis ​​de ambiente de seu pai, portanto, podemos usar um sub-shell separado para ter certeza absoluta de que nossos venvs não deixam nenhuma alteração residual para trás:


Ativar:

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

  • Isso inicia um novo shell em torno do venv . Seu bashshell original permanece inalterado.

Para desativar:

$ exit OU [CTRL] +[D]

  • Isso sai de todo o shell do venv em que se encontra e o leva de volta ao shell original antes de o script de ativação fazer alterações no ambiente.

Exemplo:

[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
fonte
-1

Eu tive o mesmo problema enquanto trabalhava em um script de instalação. Dei uma olhada no que o bin / enable_this.py fez e o invertei.

Exemplo:

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

Não tenho 100% de certeza se funciona como pretendido. Eu posso ter perdido algo completamente.

Lord Sumner
fonte
2
se desativar redefine o valor do caminho do ambiente, caminho do sistema, prompt padrão, sua função de desativação é uma boa abordagem. Eu gosto do seu roteiro. Já deu +1.
Ramkumar D