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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top