ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

有一个命令可以处理“无”——它显示所有可用的虚拟环境,非常漂亮。只需键入不带参数的“workon”,然后按 Enter。离开的命令是“停用”,如下所示。
关闭 shell 是否会停用所有使用 shell 会话的环境。只是想知道它是否修改了 Windows 的路径 env 变量并在外壳关闭后就这样离开它?
@MukeshMahadev 是的,激活仅适用于当前 shell。

B
Brandon Rhodes

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

$ deactivate

这使事情恢复正常。

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

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

conda deactivate

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

source deactivate

“停用”命令不是二进制文件,也不是您“来源”的脚本;它是一个 shell 别名,由“activate”脚本在您当前的 shell 中动态定义。
@Apreche 与此同时(大约四年后),这似乎是文档中的added
如果将其称为“workoff”或“unworkon”会更直观。或者如果“workon”被称为“activate”。感谢上帝的别名。
@kkurian — 您应该建议在 virtualenvwrapper 的问题跟踪器上,也许 Doug Hellmann 会考虑它!请注意,对于以后可能会阅读这些评论的人,workon NOT 是原生 virtualenv 命令(这是原始问题的内容),而是 virtualenvwrapper 命令!
猜猜“workon”中实际的 virtualenv 命令叫什么? ...(剧透警告)... ...(剧透警告)... ...(剧透警告)... ...(剧透警告)...激活!
P
Peter Mortensen

利用:

$ deactivate 

如果这不起作用,请尝试

$ source deactivate

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


deactivate 是在您获取 activate 文件时创建的函数。您对 source deactivate 的建议完全没有意义,因为没有名为 deactivate 的文件
这不值得反对。请参阅所选响应的编辑:source deactivate 适用于 anaconda 环境。
由于不符合 SO 答案质量标准,它“值得”投反对票。与其说是答案,不如说是评论。但是,由于海报的79声誉,我们应该很好,并给予良好的反馈。
@Abdul 我在 stackoverflow.com/posts/29586756/revisions 的第 2 版中演示了如何提高您的答案质量
如果您的 shell 中没有停用命令,这将非常无用。我真的不明白为什么这会帮助解决问题。虚拟环境中没有停用脚本。
P
Peter Mortensen

我定义了一个 aliasworkoff,作为 workon 的对立面:

alias workoff='deactivate'

很容易记住:

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

在哪个文件中? .bashrc
@seyed 是的,请参阅 this answer 以获取 ~/.bashrc 中的别名示例
我喜欢这个别名。让我想起了空手道小子(waxon;waxoff)
@C0deH4cker:我登录了 SO 并回到这个问题只是为了 +1 你的评论:p
P
Peter Mortensen

要激活 Python 虚拟环境:

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

要停用:

$deactivate

在 OS X10.11.1 的终端中,我似乎必须使用:$source activate
我不需要来源。我做了 $cd /to/dir/i/want/my/virtualenv/installed 然后 $virtualenv name_i_want_for_it 然后 $. name_i_want_for_it/bin/activate virtualenv 对我来说似乎还是有点不对劲。需要改进...
“来源”与“。”相同。 command.. 两者都可以用来获取文件
C
CephBirk

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

conda deactivate

deactivatesource deactivate 都不适合我。


deactivate 用于 virtualenv,而 source deactivate 用于 Linux 上的旧 conda。 conda deactivate 是 conda envs(不是 virtualenvs)的一种很好的跨平台方式
P
Peter Mortensen

您可以使用 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。


与内置的 virtualenv 相比,我看不出有什么不同
@NamGVU 注意 workon 命令,它适用于任何目录。
正如另一篇文章的评论中提到的(并且 Stackoverflow 没有实用的方法来指向它),如果没有首先获取定义此函数的脚本,您就不能在 shell 脚本中使用 deactivate (在这种情况下,您将拥有 找不到命令...错误)
N
Nick.McDermaid

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

CD /myworkingdirectory

然后我像这样激活我的环境:

my-env/scripts/activate

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

my-env/scripts/deactivate

这确实有效:

deactivate

W
Will Chen

使用 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!

D
DocSalvager

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

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

这可以通过仅在函数存在时执行 deactivate 来避免(即已通过采购 activate 创建)。

#!/bin/bash

declare -Ff deactivate  && deactivate

k
kyrlon

运行 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:~$

S
Sardathrion - against SE abuse

我使用基于 autoenvzsh-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" 只是一个名字……这里没有任何与光明会相关的隐藏含义。


C
C-Bizz

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


L
Léo

$ conda deactivate

$ source deactivate
可以。

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


P
Peter Mortensen

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


如果 deactivate 重置环境路径、系统路径、默认提示的值,那么您的 deactivate 功能是一个好方法。我喜欢你的剧本。已经给+1了。