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


1603

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

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

如何退出所有虚拟机并再次在真实计算机上工作?现在,我唯一要回到的方法me@mymachine:~$是退出外壳并启动一个新外壳。真烦人。有没有什么要执行的命令,如果是的话,这是什么?如果这样的命令不存在,我将如何创建它?


5
有一个命令可以使“ nothing”工作-它显示所有可用的虚拟环境,这非常漂亮。只需键入“ workon”,不带任何参数,然后按Enter。离开的命令是“停用”,如下所示。
丹妮德2014年

Answers:


2589

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

$ deactivate

这使情况恢复正常。

我只是再次专门查看的代码virtualenvwrapper,是的,它也支持deactivate从所有virtualenvs逃脱的方式。

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

conda deactivate

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

source deactivate

126
“ deactivate”命令不是二进制文件,也不是您“获取”的脚本;它是一个shell别名,可通过“激活”脚本在当前shell中动态定义。
Brandon Rhodes

6
@Apreche同时(将近四年),这似乎已添加到文档中。
gertvdijk 2013年

6
如果将其称为“锻炼”或“不工作”,则将更加直观。或者,如果“工作”被称为“激活”。谢天谢地别名。
kkurian

4
@kkurian-您应该建议在问题跟踪程序上使用virtualenvwrapper,也许Doug Hellmann会考虑!注意,对于那些谁以后可能会读这些评论,这workon不是一个原生virtualenv的命令(也就是原来的问题是关于什么的),但virtualenvwrapper命令!
布兰登·罗德斯

17
猜猜“ workon”内部的实际virtualenv命令是什么?...(扰流板警告)......(扰流板警告)......(扰流板警告)......(扰流板警告)...激活!
FutureNerd 2014年

53

我所定义的别名workoff,作为相反workon

alias workoff='deactivate'

很容易记住:

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

1
在哪个文件中?.bashrc
6

@seyed是,请参见以下答案中的别名示例~/.bashrc
Bob Stein

21
我喜欢这个别名。让我想起了空手道小子(蜡笔;蜡染)
C0deH4cker

@ C0deH4cker:我登录了SO,然后回到这个问题只是为您的评论+1:p
pooley1994

大声笑我在想(拍手;拍手)。我想我们还可以包括(混蛋)
爱迪生

53

采用:

$ deactivate 

如果这不起作用,请尝试

$ source deactivate

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


7
deactivate是在您获取activate文件时创建的函数。您的建议source deactivate完全没有意义,因为没有文件名为deactivate
Anthon

7
这是不值得的。请参阅编辑所选响应:停用源适用于蟒蛇环境。
Doug Bradshaw

2
对于不满足SO 答复质量标准的人,它应该受到谴责。与其说是答案,不如说是评论。但是,由于发布者的79声望,我们应该很好,并给出良好的反馈。
布鲁诺·布罗诺斯基


如果您的外壳中没有停用命令,这将非常无济于事。我真的不明白为什么这会解决这个问题。虚拟环境中没有停用脚本。
bgenchel '18

19

要激活Python虚拟环境:

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

停用:

$deactivate

3
在OS X10.11.1的终端上,我似乎必须使用:$source activate
Eric Milliot-Martinez 2015年

我不需要来源。我没有$cd /to/dir/i/want/my/virtualenv/installed那么$virtualenv name_i_want_for_it那么$. name_i_want_for_it/bin/activate的virtualenv还是显得有点过我。需要改进...
uchuugaka 2015年

3
“源”与“源”相同。命令..都可以用来获取文件
Corey Goldberg'1

11

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

conda deactivate

deactivate没有source deactivate为我工作,也没有为我工作。


1
deactivate用于virtualenv,并且source deactivate用于Linux上的旧conda。conda deactivate是conda envs(不是virtualenvs)的一种很好的跨平台方式
Tomasz Gandor

6

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

安装virtualenvwrapper

pip install virtualenvwrapper

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

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

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

$ workon myenv
(myenv)$

为了停用您的virtualenv:

(myenv)$ deactivate

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


2
与内置的virtualenv相比,我看不出什么区别
Nam G VU

1
@NamGVU注意该workon命令,它可以在任何目录下工作。
igaurav

1
如另一篇文章的评论中所述(并且Stackoverflow没有实用的指向方法),您必须deactivate先获取定义此功能的脚本,否则无法在Shell脚本中使用该脚本(在这种情况下,将找不到命令。) 。错误)
马里亚诺·鲁伊兹

4

由于无法通过寻找这种命令的常用方法来发现deactivate通过源创建的功能,因此您可能希望创建一个仅执行该功能的命令。~/bin/activate~/bindeactivate

问题是,如果一个脚本名叫deactivate包含单个命令,则该脚本deactivate如果不在venv中意外执行,将导致无限循环。一个常见的错误。

通过仅deactivate在函数存在时执行(即已通过source创建activate),可以避免这种情况。

#!/bin/bash

declare -Ff deactivate  && deactivate

3

使用deactivate

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

注意,(my_env)不见了。


2

我使用基于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" 只是一个名字而已。


1

使用deactivatevenv activate脚本提供的功能,您需要信任正确激活了禁用功能的代码,才能将所有环境变量完全重置为以前的状态-不仅要考虑原始激活,还要考虑所有开关配置其他在此期间您可能已经完成的工作

可能很好,但是确实会带来一种新的,非零的风险,即事后修改环境。

但是,从工艺上讲,直接更改其父级的环境变量在技术上是不可能的,因此我们可以使用单独的子外壳来确保我们venv的进程不会留下任何残留更改:


激活:

$ bash --init-file PythonVenv/bin/activate

  • 这将在周围启动一个新的shell venv。您原来的bash外壳保持不变。

停用:

$ exit[CTRL]+[D]

  • 这将退出整个外壳venv,并使您回到激活脚本对环境进行任何更改之前的原始外壳。

例:

[user@computer ~]$ echo $VIRTUAL_ENV
No virtualenv!

[user@computer ~]$ bash --init-file PythonVenv/bin/activate

(PythonVenv) [user@computer ~]$ echo $VIRTUAL_ENV
/home/user/PythonVenv

(PythonVenv) [user@computer ~]$ exit
exit

[user@computer ~]$ echo $VIRTUAL_ENV
No virtualenv!

-1

在处理安装程序脚本时,我遇到了同样的问题。我看了一下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%是否能按预期工作。我可能完全错过了一些东西。


2
如果取消激活会重设环境路径,系统路径,默认提示的值,则您的取消激活功能是不错的选择。我喜欢你的剧本。已给+1。
Ramkumar D
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.