我正在使用 virtualenv 和 virtualenvwrapper。我可以使用 workon
命令在 virtualenv 之间切换。
me@mymachine:~$ workon env1
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ workon env1
(env1)me@mymachine:~$
如何退出所有虚拟环境并再次在我的系统环境中工作?现在,我返回 me@mymachine:~$
的唯一方法是退出 shell 并开始一个新的。这有点烦人。是否有一个命令可以处理“无”,如果有,它是什么?如果这样的命令不存在,我将如何创建它?
通常,激活 virtualenv 会给你一个名为的 shell 函数:
$ deactivate
这使事情恢复正常。
我刚刚再次专门查看了 virtualenvwrapper
的代码,是的,它也支持 deactivate
作为从所有 virtualenvs 中逃脱的方式。
如果您尝试离开 Anaconda 环境,则该命令取决于您的 conda
版本。最近的版本(如 4.6)直接在您的 shell 中安装 conda
函数,在这种情况下您运行:
conda deactivate
较旧的 conda 版本改为使用独立脚本实现停用:
source deactivate
利用:
$ deactivate
如果这不起作用,请尝试
$ source deactivate
任何知道 Bash source
工作原理的人都会认为这很奇怪,但是一些围绕 virtualenv 的包装器/工作流将它作为 source activate
的补充/对应物来实现。你的旅费可能会改变。
deactivate
是在您获取 activate
文件时创建的函数。您对 source deactivate
的建议完全没有意义,因为没有名为 deactivate
的文件
我定义了一个 alias,workoff,作为 workon 的对立面:
alias workoff='deactivate'
很容易记住:
[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$
.bashrc
?
~/.bashrc
中的别名示例
要激活 Python 虚拟环境:
$cd ~/python-venv/
$./bin/activate
要停用:
$deactivate
$source activate
$cd /to/dir/i/want/my/virtualenv/installed
然后 $virtualenv name_i_want_for_it
然后 $. name_i_want_for_it/bin/activate
virtualenv 对我来说似乎还是有点不对劲。需要改进...
我发现在 Miniconda3 环境中我必须运行:
conda deactivate
deactivate
和 source deactivate
都不适合我。
deactivate
用于 virtualenv
,而 source deactivate
用于 Linux 上的旧 conda。 conda deactivate
是 conda envs(不是 virtualenvs)的一种很好的跨平台方式
您可以使用 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
这里是my tutorial,一步一步介绍如何安装 virtualenv 和 virtualenvwrapper。
workon
命令,它适用于任何目录。
deactivate
(在这种情况下,您将拥有 找不到命令...错误)
对于我的特殊情况,我转到工作目录
CD /myworkingdirectory
然后我像这样激活我的环境:
my-env/scripts/activate
从同一个工作文件夹(/myworkingdirectory
)停用,我尝试了这个,但它什么也没做:
my-env/scripts/deactivate
这确实有效:
deactivate
使用 venv 的 activate
脚本提供的 deactivate
功能需要您相信停用函数已正确编码才能将所有环境变量干净地重置为之前的状态 - 不仅要考虑原始激活,以及您在此期间可能完成的任何开关、配置或其他工作。
这可能没问题,但它确实引入了一种新的、非零的风险,即事后修改您的环境。
但是,从技术上讲,进程无法直接更改其父进程的环境变量,因此我们可以使用单独的子 shell 来确保我们的 venv
不会留下任何残留物背后的变化:
激活:
$ bash --init-file PythonVenv/bin/activate
这会在 venv 周围启动一个新的 shell。您原来的 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!
由于通过在 ~/bin
中查找此类命令的常规方法无法发现通过采购 ~/bin/activate
创建的 deactivate
函数,因此您可能希望创建一个仅执行函数 deactivate
的函数。
问题是一个名为 deactivate
的脚本包含一个命令 deactivate
如果在不在 venv 中时意外执行,将导致无限循环。一个常见的错误。
这可以通过仅在函数存在时执行 deactivate
来避免(即已通过采购 activate
创建)。
#!/bin/bash
declare -Ff deactivate && deactivate
运行 deactivate [name of your environment]
可以退出/停用您的 Python 环境。
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\klongwood3\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:~$
我使用基于 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"
只是一个名字……这里没有任何与光明会相关的隐藏含义。
在我的情况下,我能够使用 env-name\scripts\activate
激活虚拟环境并使用 deactivate
停用它。但是,在我的 Windows PC deactivate
上运行更新后,不再将其识别为内部或外部命令。从那一刻起我使用的是 env-name\scripts\deactivate
并解决了问题。
$ conda deactivate
或
$ source deactivate
可以。
如果它不起作用,请尝试 deactivate [name of your environment]
。
我在处理安装程序脚本时遇到了同样的问题。我看了一下 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% 确定它是否按预期工作。我可能完全错过了一些东西。
virtualenvwrapper
的问题跟踪器上,也许 Doug Hellmann 会考虑它!请注意,对于以后可能会阅读这些评论的人,workon
NOT 是原生virtualenv
命令(这是原始问题的内容),而是virtualenvwrapper
命令!