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

如何离开/退出/停用Python virtualenv,python,virtualenv,virtualenvwrapper,Python,Virtualenv,Virtualenvwrapper,我用的是virtualenv和VirtualenvRapper。我可以使用workon命令在virtualenv之间切换 me@mymachine:~$ workon env1 (env1)me@mymachine:~$ workon env2 (env2)me@mymachine:~$ workon env1 (env1)me@mymachine:~$ 如何退出所有虚拟机并再次在真实机器上工作?现在,我唯一能回到me@mymachine:~$将退出shell并启动一个新的shell。那有点

我用的是virtualenv和VirtualenvRapper。我可以使用
workon
命令在virtualenv之间切换

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

如何退出所有虚拟机并再次在真实机器上工作?现在,我唯一能回到
me@mymachine:~$
将退出shell并启动一个新的shell。那有点烦人。是否有“无”操作的命令,如果有,是什么命令?如果这样的命令不存在,我将如何创建它?

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

$ deactivate
这让一切恢复正常

我刚刚又专门研究了
virtualnvwrapper
的代码,是的,它也支持
停用
作为逃离所有virtualnv的方法

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

conda deactivate
较旧的conda版本使用独立脚本执行停用:

source deactivate

我在编写安装程序脚本时遇到了同样的问题。我看了一下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%确定它是否按预期工作。我可能完全错过了什么。

我定义了一个,workoff,作为workon的反面:

alias workoff='deactivate'
很容易记住:

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

如果这不起作用,试试看

$ source deactivate

任何知道如何工作的人都会认为这很奇怪,但virtualenv的一些包装器/工作流将其作为
源代码激活
的补充/对应物来实现。您的里程数可能会有所不同。

要激活Python虚拟环境,请执行以下操作:

$cd ~/python-venv/
$./bin/activate
deactivate
要停用:

$deactivate

您可以使用
virtualenvwrapper
来简化使用
virtualenv
的方式

安装虚拟说唱歌手:

pip install virtualenvwrapper
如果使用标准shell,请打开
~/.bashrc
~/.zshrc
(如果使用)。添加以下两行:

export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
要激活现有virtualenv,请使用命令
workon

$ workon myenv
(myenv)$
要停用您的virtualenv,请执行以下操作:

(myenv)$ deactivate
下面是如何安装virtualenv和virtualenvwrapper的逐步介绍。

我使用的是基于

自动地 源(已知/白名单)
.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
目录时,虚拟环境将自动退出


“开发树实用程序”
只是一个名称……这里没有隐藏的链接到照明装置的意思。

使用
停用

(my_env) user@user:~/my_env$ deactivate
user@user-Lenovo-E40-80:~/my_env$ 
#!/bin/bash

declare -Ff deactivate  && deactivate

请注意,
(my_env)
已消失。

只需在虚拟环境中的命令行中键入以下命令:

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

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

conda deactivate

deactivate
source deactivate
对我都不起作用。

由于通过在
~/bin/activate
中查找此类命令的常规方法无法发现由源代码
~/bin
创建的
deactivate
函数,因此您可能希望创建一个仅执行该函数的函数e

(my_env) user@user:~/my_env$ deactivate
user@user-Lenovo-E40-80:~/my_env$ 
#!/bin/bash

declare -Ff deactivate  && deactivate
问题在于,名为
deactivate
的脚本包含单个命令
deactivate
,如果在不在venv中的情况下意外执行,将导致无休止的循环。这是一个常见错误

如果功能存在(即通过寻源
activate
创建),则仅通过执行
deactivate
即可避免此问题


使用venv的
激活
脚本提供的
停用
功能,要求您相信停用功能已正确编码
以干净地将所有环境变量重置回原来的状态-不仅考虑原始激活,还考虑任何开关、配置,或者你在此期间可能做过的其他工作

这可能没什么问题,但它确实引入了一种新的非零风险,即在以后修改环境

然而,从技术上讲,一个过程不可能直接改变其父进程的环境变量,因此我们可以使用一个单独的子外壳来绝对确保我们的
venv
s不会留下任何剩余的变化:


要激活:
$bash--init文件PythonVenv/bin/activate

  • 这将在
    venv
    周围启动一个新的shell。您原来的
    bash
    shell保持不变
要停用:
$exit
[CTRL]
+
[D]

  • 这将退出
    venv
    所在的整个shell,并在激活脚本对环境进行任何更改之前将您放回原始shell

例子:
它非常简单,以便停用您的虚拟环境

  • 如果使用蟒蛇-使用
    conda停用
  • 如果不使用蟒蛇-使用源代码停用

对于我的特殊情况,我转到工作目录

CD /myworkingdirectory
然后我激活我的环境,如下所示:

my-env/scripts/activate
从同一个工作文件夹(
/myworkingdirectory
)中,我尝试了此操作,但没有任何效果:

my-env/scripts/deactivate
这确实有效:

deactivate

“deactivate”命令不是二进制文件,也不是您“源”的脚本;它是一个shell别名,由“activate”脚本在您当前的shell中动态定义。@Apreche同时(大约四年后)这似乎已经出现在文档中。如果称为“workoff”或或者如果“工作”被称为“激活”