Как оставить / exit / деактивировать Python virtualenv
-
13-09-2019 - |
Вопрос
Я использую virtualenv и virtualenvwrapper.Я могу переключаться между virtualenv просто отлично, используя workon
команда.
me@mymachine:~$ workon env1
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ workon env1
(env1)me@mymachine:~$
Однако, как мне выйти из всех виртуальных машин и снова работать на моей реальной машине?Прямо сейчас, это единственный способ, который у меня есть, чтобы вернуться к
me@mymachine:~$
заключается в том, чтобы выйти из командной строки и запустить новую.Это немного раздражает.Есть ли команда для работы с "ничем", и если да, то что это такое?Если такой команды не существует, как бы я приступил к ее созданию?
Решение
Обычно активация virtualenv дает вам функцию оболочки с именем:
$ deactivate
что возвращает все в норму.
Я только что еще раз внимательно рассмотрел код для virtualenvwrapper,
и да, он тоже поддерживает deactivate
как способ сбежать из всех виртуальных пространств.
Если вы пытаетесь покинуть Анаконда среде процедура немного другая:выполнить команду из двух слов source deactivate
поскольку они реализуют деактивацию с помощью автономного скрипта.
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.
Другие советы
Я определил псевдоним отработка как противоположность workon:
alias workoff='deactivate'
Легко вспомнить:
[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$
$ deactivate
Если это не сработает, попробуйте
$ source deactivate
Тот, кто знает, как бить source
Works подумают, что это странно, но некоторые оболочки/рабочие процессы вокруг virtualenv реализуются как дополнение/аналог для source activate
.ЯММВ
чтобы активировать виртуальную среду Python:
$cd ~/python-venv/
$./bin/activate
чтобы деактивировать:
$deactivate
Я обнаружил, что в среде Miniconda3 мне пришлось запустить:
conda deactivate
Ни один deactivate
ни source deactivate
работал у меня.
Вы можете использовать virtualenvwrapper
чтобы облегчить вам работу с virtualenv
Установка virtualenvwrapper
pip install virtualenvwrapper
Если вы используете стандартную оболочку, откройте ~/.bashrc
или ~/.zshrc
если вы используете oh-my-zsh.Добавьте эти две строки:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
Чтобы активировать существующую виртуальную среду, используйте команду workon:
$ workon myenv
(myenv)$
Чтобы деактивировать виртуальную среду:
(myenv)$ deactivate
Вот мой руководство, шаг за шагом, как установить virtualenv и virtualenvwrapper
Использовать deactivate
.
(my_env) user@user:~/my_env$ deactivate
user@user-Lenovo-E40-80:~/my_env$
Примечание, (my_env)
ушел.
Поскольку deactivate
функция, созданная путем поиска ~/bin/activate
не может быть обнаружен обычными способами поиска такой команды в ~/bin
, вы можете создать тот, который просто выполняет функцию deactivate
.
Проблема в том, что скрипт с именем deactivate
содержащий одну команду deactivate
вызовет бесконечный цикл, если случайно будет выполнен вне venv.Распространенная ошибка.
Этого можно избежать, просто выполнив deactivate
если функция существует (т.е.был создан путем поиска activate
).
#!/bin/bash
declare -Ff deactivate && deactivate
Я использую zsh-автоматическое включение который основан на автоматическое включение.
zsh-автоматическое включение автоматически источники (известные/ занесенные в белый список)
.autoenv.zsh
файлы, обычно используемые в корневых каталогах проекта.Он обрабатывает события "ввода" и "выхода", вложение и сохранение переменных (перезапись и восстановление).
Вот такой пример:
; 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
Поэтому, когда я ухожу из dtree
каталог, виртуальная среда автоматически завершается.
У меня была такая же проблема во время работы над сценарием установщика, я взглянул на то, что бен/activate_this.py сделал и перевернул.
Пример:
#! /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())
Не на 100% уверен, что это работает так, как задумано, возможно, я что-то совсем упустил.