如何离开/退出/停用Python虚拟环境

我正在使用虚拟环境和虚拟环境包装器。我可以使用workon命令在虚拟环境之间切换。

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

如何退出所有虚拟环境并再次在我的系统环境中工作?现在,我回到me@mymachine:~$的唯一方法是退出shell并启动一个新的。这有点烦人。有命令可以在“无”上工作吗?如果有,是什么?如果不存在这样的命令,我将如何创建它?

1747953 次浏览

通常,激活虚拟环境会给你一个shell函数,名为:

$ deactivate

这让事情恢复正常。

我刚刚再次特别查看了virtualenvwrapper的代码,是的,它也支持deactivate作为逃离所有虚拟环境的方式。

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

conda deactivate

较旧的conda版本而是使用独立脚本实现停用:

source deactivate

我在处理安装程序脚本时也遇到了同样的问题。我看了看bin/activate_this.py做了什么并反转了它。

示例:

#! /usr/bin/python# -*- coding: utf-8 -*-import osimport sys
# Path to virtualenvvenv_path = os.path.join('/home', 'sixdays', '.virtualenvs', 'test32')
# Save old valuesold_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 valuesos.environ['PATH'] = old_os_pathsys.prefix = old_sys_prefixsys.path[:0] = old_sys_path

# Activate the virtualenvironmentactivate_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 purposeimport pipprint str(pip.get_installed_distributions())
# Unload pip moduledel pip
# Deactivate/switch back to initial interpreterdeactivate()
# Print list of initial environment pip packages for example purposeimport pipprint str(pip.get_installed_distributions())

我不能百分之百确定它是否按预期工作。我可能完全错过了一些东西。

我定义了一个别名工作,与工作相反:

alias workoff='deactivate'

很容易记住:

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

用途:

$ deactivate

如果这行不通,试试看

$ source deactivate

任何知道bash#0是如何工作的人都会认为这很奇怪,但是一些围绕虚拟环境的包装器/工作流将其实现为source activate的补充/对应物。你的里程可能会有所不同。

要激活Python虚拟环境:

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

要停用:

$deactivate

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

安装virtualenvwrapper

pip install virtualenvwrapper

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

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

要激活现有的虚拟环境,请使用命令workon

$ workon myenv(myenv)$

为了停用您的虚拟环境:

(myenv)$ deactivate

这里是我的教程,一步一步地介绍如何安装虚拟环境和虚拟环境包装器。

我使用zsh-autoenv,它基于autoenv

zsh-autoenv自动来源(已知/白名单).autoenv.zsh文件,通常用于项目根目录。它处理“进入”和“离开”事件,嵌套和变量的隐藏(覆盖和恢复)。

下面是一个例子:

; cd dtreeSwitching 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# eofdtree(feature/task24|✓); cat .autoenv_leave.zshdeactivate

因此,当我离开dtree目录时,虚拟环境会自动退出。

"Development tree utiles"只是一个名字…没有隐藏的意思连接到这里的光明会。

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

conda deactivate

deactivatesource deactivate都不适合我。

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

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

如果函数存在(即由源activate创建),则可以通过仅执行deactivate来避免这一点。

#!/bin/bash
declare -Ff deactivate  && deactivate

使用venv的#1脚本提供的#0功能需要您相信停用函数被正确编码将所有环境变量完全重置回以前的状态-不仅考虑到原始激活,还考虑到您在此期间可能完成的任何开关配置其他工作

这可能是好的,但它确实引入了一个新的,非零风险的离开你的环境修改后。

但是,从技术上讲,进程不可能直接更改其父进程的环境变量,所以我们可以用一个单独的子壳来确定我们的venv不会留下任何剩余的更改:


要激活:

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

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

要停用:

$ exit[CTRL]+[D]

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

示例:

[user@computer ~]$ echo $VIRTUAL_ENVNo virtualenv!
[user@computer ~]$ bash --init-file PythonVenv/bin/activate
(PythonVenv) [user@computer ~]$ echo $VIRTUAL_ENV/home/user/PythonVenv
(PythonVenv) [user@computer ~]$ exitexit
[user@computer ~]$ echo $VIRTUAL_ENVNo virtualenv!

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

CD /myworkingdirectory

然后我像这样激活我的env:

my-env/scripts/activate

从同一个工作文件夹(/myworkingdirectory)停用,我尝试了这个,但它什么也没做:

my-env/scripts/deactivate

这确实有效:

deactivate

运行deactivate [name of your environment]能够退出/停用您的python环境。

PowerShell中的python3.6 Windows 10示例:

PS C:\Users\kyrlon\Desktop> py -m venv env1PS C:\Users\kyrlon\Desktop> .\env1\Scripts\activate(env1) PS C:\Users\kyrlon\Desktop> deactivate env1PS C:\Users\kyrlon\Desktop> py -m venv env1

在Ubuntu 20.04 LTS桌面上Linuxpython3.9示例:

kyrlon@pc1:~$ python3 -m venv venv1kyrlon@pc1:~$ source venv1/bin/activate(venv1) kyrlon@pc1:~$ deactivate venv1kyrlon@pc1:~$

在我的情况下,我能够使用env-name\scripts\activate激活虚拟环境并使用deactivate停用它。然而,在我的Windows PCdeactivate上运行更新后,不再被识别为内部或外部命令。从那一刻起,我使用的是env-name\scripts\deactivate,这解决了问题。

$ conda deactivate

$ source deactivate


如果不起作用,请尝试deactivate [name of your environment]