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

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

如何退出所有虚拟环境并再次使用系统环境?现在,我唯一能回到me@mymachine:~$是退出shell并开始新的shell。这有点烦人。是否有命令处理“无”,如果有,是什么?如果不存在这样的命令,我将如何创建它?


通常,激活virtualenv会给您一个名为的shell函数:

$ deactivate

这使事情恢复正常。

我刚刚再次具体查看了virtualvwrapper的代码,是的,它也支持停用,作为逃离所有virtualv的方法。

如果您试图离开Anaconda环境,命令取决于您的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 ~]$

Use:

$ deactivate 

如果这不起作用,请尝试

$ source deactivate

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


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

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

要停用:

$deactivate

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

安装virtualvwrapper:

pip install virtualenvwrapper

如果使用的是标准shell,请打开~/.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和virtualvwrapper。


我使用基于autoenv的zsh autoenv。

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

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


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

conda deactivate

去激活和源去激活对我都不起作用。


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

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

如果功能存在(即通过源激活创建),则只执行停用即可避免这种情况。

#!/bin/bash

declare -Ff deactivate  && deactivate

使用venv的激活脚本提供的去激活功能需要您相信去激活功能是正确编码的,以便将所有环境变量干净地重置为原来的状态-不仅要考虑到原始激活,还要考虑到您在此期间可能完成的任何开关、配置或其他工作。

这可能很好,但它确实引入了一个新的、非零的风险,即在之后修改环境。

然而,从技术上讲,一个进程不可能直接更改其父进程的环境变量,因此我们可以使用单独的子shell来确保我们的供应商不会留下任何剩余的更改:


要激活:

$bash--初始化文件PythonVenv/bin/activate

这将在供应商周围开始一个新的外壳。原始bash shell保持未修改。

要停用:

$exit或[CTRL]+[D]

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


例子:

[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!

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

CD /myworkingdirectory

然后我像这样激活env:

my-env/scripts/activate

从要停用的同一个工作文件夹(/myworkingdirectory)中,我尝试了此操作,但它无效:

my-env/scripts/deactivate

这确实有效:

deactivate

运行deactivate[环境名称]可以从python环境中退出/停用。

PowerShell中的python3.6 Windows 10示例:

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

Linux Ubuntu 20.04 LTS桌面上的python3.9示例:

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

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


$conda停用或$source停用会起作用。如果不起作用,请尝试停用[环境名称]。