Como sair / saída / desactivar um virtualenv Python
-
13-09-2019 - |
Pergunta
Eu estou usando virtualenv eo virtualenvwrapper. Posso alternar entre apenas multa de virtualenv usando o comando workon
.
me@mymachine:~$ workon env1
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ workon env1
(env1)me@mymachine:~$
No entanto, como faço para sair todas as máquinas virtuais e workon minha máquina real novamente? Agora, a única maneira que tenho de voltar a
me@mymachine:~$
é para sair do shell e começar um novo. Isso é meio chato. Existe um comando para workon "nada", e se assim for, o que é? Se tal comando não existe, como eu iria sobre a criação dele?
Solução
Geralmente, a ativação de um virtualenv dá-lhe uma função shell chamado:
$ deactivate
que coloca as coisas de volta ao normal.
Eu apenas olhou especificamente novamente no código para virtualenvwrapper,
e, sim, ele também suporta deactivate
como a maneira de escapar de todos os virtualenvs.
Se você está tentando sair de uma Anaconda ambiente, o procedimento é um pouco diferente:. Executar o comando source deactivate
de duas palavras, uma vez que implementar desativação usando um script autônomo
bash-4.3$ deactivate
pyenv-virtualenv: deactivate must be sourced. Run 'source deactivate' instead of 'deactivate'
bash-4.3$ source deactivate
pyenv-virtualenv: no virtualenv has been activated.
Outras dicas
I definiu uma apelido workoff como o oposto do workon:
alias workoff='deactivate'
Fácil de lembrar:
[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$
$ deactivate
Se isto não funcionar, tente
$ source deactivate
Qualquer um que sabe como festa source
obras vão pensar que é estranho, mas alguns invólucros / fluxos de trabalho em torno virtualenv implementar como um elogio / contrapartida source activate
. YMMV
Para ativar python ambiente virtual:
$cd ~/python-venv/
$./bin/activate
para desativar:
$deactivate
Eu descobri que quando dentro de um ambiente Miniconda3 eu tive que correr:
conda deactivate
Nem deactivate
nem source deactivate
funcionou para mim.
Você pode usar virtualenvwrapper
, a fim de facilitar a maneira de trabalhar com virtualenv
A instalação virtualenvwrapper
pip install virtualenvwrapper
Se você estiver usando shell padrão, abra seu ~/.bashrc
ou ~/.zshrc
se você usar oh-meu-zsh. Adicione 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 sua virtualenv:
(myenv)$ deactivate
Aqui está o meu tutorial , passo a passo em como instalar virtualenv e virtualenvwrapper
Use deactivate
.
(my_env) user@user:~/my_env$ deactivate
user@user-Lenovo-E40-80:~/my_env$
Note, (my_env)
está desaparecido.
Uma vez que a função deactivate
criado com a terceirização ~/bin/activate
não pode ser descoberto pelos meios usuais de procura de um tal comando em ~/bin
, você pode querer criar um que apenas executa a função deactivate
.
O problema é que um deactivate
script chamado contendo um único deactivate
comando irá causar um loop infinito, se for acidentalmente executado enquanto não na venv. Um erro comum.
Isto pode ser evitado apenas por execução deactivate
se existe a função (isto é, foi criado por abastecimento activate
).
#!/bin/bash
declare -Ff deactivate && deactivate
Eu uso zsh-autoenv que é baseado fora autoenv .
zsh-autoenv automaticamente fontes (conhecidas na lista de autorizações /) arquivos
.autoenv.zsh
, tipicamente utilizado em diretórios raiz do projeto. Ele lida com "enter" e deixar" eventos, aninhamento, e stashing de variáveis ??(substituindo e restauração).
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
Então, quando eu deixar o diretório dtree
, o ambiente virtual é automaticamente cancelado.
Tive o mesmo problema sozinho, enquanto trabalhava em um script de instalação, dei uma olhada no que o bin / activate_this.py fez e inverteu-lo.
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
# deactive/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 100% de certeza se ele funciona como se pretendia, eu possa ter perdido algo completamente.