使用 direnv 激活 virtualenv 不会激活 virtualenv

问题描述 投票:0回答:2

当我切换到目录时,我使用 direnv 来获取我的 virtualenv 。

project/
   .envrc
   env/ <--- my virtualenv

.envrc

source env/bin/activate

当我将目录更改为

/project
时,我得到输出:

direnv: loading .envrc
direnv: export +VIRTUAL_ENV -PS2 ~PATH

它将 env 目录添加到我的 PATH 环境变量中,因此当我运行

which python
which pip
时,它们都指向我的
env
目录中的 python 和 pip

$ which python
/USER/project/env/bin/python
$ which pip
/USER/project/env/bin/pip

但是,它似乎并没有像我期望的那样运行

source env/bin/activate
。我希望它通过将 virtualenv 名称 (env) 添加到 CLI 提示符来激活我的 virtualenv,并授予对
deactivate
命令的访问权限,但这两种情况都没有发生。我对 direnv 和 virtualenv 的工作方式有什么误解吗?我是 Python 新手,所以我不确定是否有现有的工具可以做这样的事情。

python virtualenv direnv
2个回答
12
投票

我认为首先了解 direnv 的工作原理以形成正确的心理模型很重要; direnv 不会直接在当前 shell 中加载

.envrc
。相反,它启动一个新的 bash shell,执行其中的
.envrc
,记录环境中的更改并将 diff bash 导出到当前 shell。

这里发生的事情是:

virtualenv 使用

$PS1
设置提示符。这是一个局部变量,因此不会重新导出。
direnv
还会过滤
PS1
,因为它在未设置时会导致旧 macOS bash 上出现段错误。

deactivate()
函数不会从bash子shell中导出,因为它不是环境变量。

实际上,激活正如您所注意到的那样起作用。 python 位于正确的路径中,运行

pip
easy_install
将在 virtualenv 中安装东西。不需要停用,因为当
cd
-ing 退出目录时,direnv 会自动卸载环境。

要恢复自定义提示,wiki 上提供了更多信息:https://github.com/direnv/direnv/wiki/Python#restoring-the-ps1


10
投票

有一个“隐藏”功能可以在 direnv 中执行您想要的操作。您必须查看 direnv 加载的 toolbox 以便在

.envrc
文件中使用。您可以使用
layout
命令和 python (
layout python3
) 在进入目录时激活 virtualenv,并在退出目录时停用它。它甚至会在第一次创建 virtualenv。

另请注意

source_up
不断加载文件系统中更高位置的
.envrc
文件。我通过创建一个包含以下内容的
.envrc
文件来开始我的所有项目:

layout python3
source_up

这将自动创建、激活和停用 python virtualenv,并继续从更高级别的

.envrc
文件中读取变量。当前项目的环境变量只会进入本地
.envrc

© www.soinside.com 2019 - 2024. All rights reserved.