如何离开 / 退出 / 停用 Python virtualenv

我正在使用 virtualenv 和 virtualenvwrapper。我可以使用workon命令在 virtualenv 之间切换。

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

但是,如何退出所有虚拟机并再次在我的真实计算机上工作?现在,我唯一要回到的方式

me@mymachine:~$

是退出外壳并开始一个新的外壳。真烦人。有没有什么要执行的命令,如果是的话,这是什么?如果这样的命令不存在,我将如何创建它?

答案

通常,激活 virtualenv 会给您提供一个名为:

$ deactivate

这使情况恢复正常。

我只是再次专门查看了virtualenvwrapper的代码,是的,它也支持deactivate作为从所有 virtualenv 逃逸的方式。

如果您要离开Anaconda环境,则该命令取决于您的conda版本。最新版本(如 4.6)直接在您的 shell 中安装conda函数,在这种情况下,您可以运行:

conda deactivate

较旧的 conda 版本改为使用独立脚本实现停用:

source deactivate

我定义了一个别名 workoff ,与workon相反:

alias workoff='deactivate'

很容易记住:

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

采用:

$ deactivate

如果这不起作用,请尝试

$ source deactivate

任何知道Bash source如何工作的人都会认为这很奇怪,但是围绕 virtualenv 的一些包装器 / 工作流将其实现为source activate的补充 / 对应。你的旅费可能会改变。

要激活 Python 虚拟环境:

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

停用:

$deactivate

我发现在 Miniconda3 环境中必须运行:

conda deactivate

deactivatedeactivate source deactivate均不适用于我。

您可以使用virtualenvwrapper为了缓解你的工作方式virtualenv

安装virtualenvwrapper

pip install virtualenvwrapper

如果使用的是标准外壳,则使用Oh My Zsh打开~/.bashrc~/.zshrc .zshrc 。添加这两行:

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

要激活现有的 virtualenv,请使用命令workon

$ workon myenv
(myenv)$

为了停用您的 virtualenv:

(myenv)$ deactivate

这是我的教程 ,逐步介绍了如何安装 virtualenv 和 virtualenvwrapper。

由于无法通过在~/bin中查找这样的命令的常规方法来发现通过源~/bin/activate创建的deactivate功能,因此您可能希望创建一个仅执行deactivate功能的命令。

问题是,一个脚本名为deactivate含有一个命令deactivate会造成死循环,如果不同时在 VENV 意外执行。一个常见的错误。

可以通过仅在功能存在时执行deactivate来避免这种情况(即通过activate源创建的)。

#!/bin/bash

declare -Ff deactivate  && deactivate

使用deactivate

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

注意, (my_env)不见了。

我使用基于autoenv 的 zsh- autoenv

zsh-autoenv自动获取(已知 / 列入白名单的) .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目录时,虚拟环境将自动退出。

"Development tree utiles"只是一个名字…… 在这里没有链接到光明会的隐含含义。

在处理安装程序脚本时,我遇到了同样的问题。我看了一下bin / 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

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

我不确定 100%是否可以正常使用。我可能完全错过了一些东西。