如何离开/退出/停用 Python 虚拟环境
- 2025-03-06 08:52:00
- admin 原创
- 232
问题描述:
我正在使用 virtualenv 和 virtualenvwrapper。我可以使用命令在 virtualenv 之间轻松切换workon
。
me@mymachine:~$ workon env1
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ workon env1
(env1)me@mymachine:~$
我如何退出所有虚拟环境并再次在系统环境中工作?目前,我唯一能返回的方法me@mymachine:~$
就是退出 shell 并启动一个新 shell。这有点烦人。是否有一个命令可以处理“无”内容?如果有,它是什么?如果不存在这样的命令,我该如何创建它?
解决方案 1:
通常,激活虚拟环境会给你一个名为的 shell 函数:
$ deactivate
一切就会恢复正常。
我刚刚再次特别查看了代码virtualenvwrapper
,是的,它也支持deactivate
退出所有虚拟环境的方法。
如果你尝试离开Anaconda环境,命令取决于你的版本conda
。较新的版本(如 4.6)会conda
直接在你的 shell 中安装一个函数,在这种情况下,你可以运行:
conda deactivate
较旧的 conda 版本使用独立脚本实现停用:
source deactivate
解决方案 2:
使用:
$ deactivate
如果这不起作用,请尝试
$ source deactivate
任何了解Bashsource
工作原理的人都会认为这很奇怪,但是一些围绕 virtualenv 的包装器/工作流程将其实现为 的补充/对应部分source activate
。您的里程可能会有所不同。
解决方案 3:
要激活 Python 虚拟环境:
$ cd ~/python-venv/
$ ./bin/activate
要停用:
$ deactivate
解决方案 4:
我定义了一个别名,workoff ,作为workon的对立面:
alias workoff='deactivate'
很容易记住:
[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$
解决方案 5:
在 MacOs ventura 中 -
激活 -
sudo chmod -R 755 ./venv/bin
source venv/bin/activate
停用 -
deactivate
解决方案 6:
运行deactivate [name of your environment]
可以退出/停用您的 python 环境。
PowerShell 中使用 python3.6 Windows 10 的示例:
PS C:UserskyrlonDesktop> py -m venv env1
PS C:UserskyrlonDesktop> .env1Scriptsactivate
(env1) PS C:UserskyrlonDesktop> deactivate env1
PS C:UserskyrlonDesktop> 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:~$
解决方案 7:
我发现在 Miniconda3 环境中我必须运行:
conda deactivate
对我来说都deactivate
不起作用source deactivate
。
解决方案 8:
使用deactivate
venvactivate
脚本提供的功能需要您信任停用功能经过正确编码,以便将所有环境变量干净地重置为之前的状态 - 不仅考虑原始激活,还考虑您在此期间可能完成的任何开关、配置或其他工作。
这可能没什么问题,但它确实带来了一个新的、非零的风险,即事后修改你的环境。
但是,从技术上来说,进程不可能直接改变其父进程的环境变量,因此我们可以使用单独的子 shell 来绝对确保我们的venv
进程不会留下任何残留更改:
激活方法:
$ bash --init-file PythonVenv/bin/activate
这将在 周围启动一个新的 shell
venv
。您的原始bash
shell 保持不变。
要停用:
$ exit
或[CTRL]
+[D]
这将退出所在的整个 shell
venv
,并返回到激活脚本对环境进行任何更改之前的原始 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!
解决方案 9:
对于我的具体情况,我转到工作目录
CD /myworkingdirectory
然后我像这样激活我的环境:
my-env/scripts/activate
从同一个工作文件夹(/myworkingdirectory
)中停用,我尝试了这个,但它没有任何反应:
my-env/scripts/deactivate
这确实有效:
deactivate
解决方案 10:
您可以使用virtualenvwrapper
来简化您的工作方式virtualenv
。
安装virtualenvwrapper
:
pip install virtualenvwrapper
如果你使用的是标准 shell,请打开你的~/.bashrc
,或者~/.zshrc
如果你使用Oh My Zsh。添加以下两行:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
要激活现有的虚拟环境,请使用命令workon
:
$ workon myenv
(myenv)$
为了停用你的虚拟环境:
(myenv)$ deactivate
这是我的教程,逐步介绍如何安装 virtualenv 和 virtualenvwrapper。
解决方案 11:
$ conda deactivate
或
$ source deactivate
会起作用。
如果不起作用,请尝试deactivate [name of your environment]
其他方法。
解决方案 12:
由于通过通常在 中查找此类命令的方式无法发现deactivate
由源创建的函数,因此您可能希望创建一个仅执行该函数的命令。~/bin/activate
`~/bin`deactivate
问题是,如果在 venv 之外意外执行deactivate
包含单个命令的脚本,则会导致无限循环。这是一个常见的错误。deactivate
deactivate
可以通过仅在函数存在(即已通过源创建activate
)时执行来避免这种情况。
#!/bin/bash
declare -Ff deactivate && deactivate
解决方案 13:
就我而言,我能够使用 激活虚拟环境env-namescriptsactivate
并使用 停用它deactivate
。但是,在我的 Windows PC 上运行更新后,deactivate
它不再被识别为内部或外部命令。从那时起,我使用的是env-namescriptsdeactivate
,这解决了问题。
解决方案 14:
我使用基于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%se[0m
" "Development tree utiles"
workon dtree
# eof
dtree(feature/task24|✓); cat .autoenv_leave.zsh
deactivate
所以当我离开dtree
目录时,虚拟环境就会自动退出。
"Development tree utiles"
只是一个名字...这里没有与光明会有任何联系的隐藏含义。
解决方案 15:
如果你不知道如何退出某些 Python 环境,我建议你运行
bash --norc
因为存在一个风险,即你忘记删除进入某些 python 环境的代码,而 conda/mamba 等程序已经安装在你的环境中。conda .bashrc
/mamba 进入环境的方式与在 bash 中运行 bash 的方式相同。默认安装会强制默认激活基本环境,这让我很抓狂,因为它可能会破坏很多东西,要退出它,你只需输入
mamba deactivate
但是你可以配置 conda,让它只在你使用时激活。然后如果你输入
mamba activate env
(env)mamba activate base
(base)mamba activate base
(base)mamba activate xy
您实际上将处于嵌套环境中(xy)
。 (xy) -deactivate-> (base) -deactivate-> (base) -deactivate-> (env) -deactivate-> no conda/mamba
因此,如果你处于某个环境中,不知道它嵌套了多少层,并且想要获取基本环境,你也可以使用
mamba activate base
解决方案 16:
我在处理安装程序脚本时遇到了同样的问题。我查看了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% 确定它是否按预期工作。我可能完全错过了一些东西。
扫码咨询,免费领取项目管理大礼包!