使用 direnov 激活 virtualenv 不会激活 virtualenv



当我进入目录时,我正在使用direnov来获取我的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 提示符并授予对deactivate命令的访问权限来激活我的 virtualenv,但两者都不会发生。我对direnov和virtualenv的工作原理有什么误解吗?我是python的新手,所以我不确定是否有现有的工具可以做这样的事情。

我认为首先了解direnov如何形成适当的心智模型很重要;direnov不会直接在当前的shell中加载.envrc。相反,它会启动一个新的 bash shell,在其中执行.envrc,记录环境的变化并将 diff bash 导出到当前 shell 中。

这里发生的事情是:

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

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

实际上,激活就像您注意到的那样工作。 python处于正确的路径中,运行pipeasy_install将在virtualenv中安装东西。 不需要停用,因为 direncv 会在cd出目录时自动卸载环境。

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

有一个"隐藏"功能可以在direnv中做你想做的事情。您必须查看 direnv 加载的工具箱,以便在.envrc文件中使用。您可以将layout命令与 python (layout python3( 一起使用,在进入目录时激活虚拟环境,并在退出目录时停用它。它甚至会负责第一次创建虚拟环境。

另请查看在文件系统中不断加载.envrc文件的source_up。我通过创建具有以下内容的.envrc文件来启动所有项目:

layout python3
source_up

这将自动创建、激活和停用 python virtualenv,并继续从更高级别的.envrc文件中读取变量。当前项目的环境变量将仅进入本地.envrc

相关内容

  • 没有找到相关文章

最新更新