使用 direnv 激活 virtualenv 不会激活 virtualenv

Eph*_*pox 2 python virtualenv direnv

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

/project
   .envrc
   /env <--- my virtualenv
Run Code Online (Sandbox Code Playgroud)

.envrc

source env/bin/activate
Run Code Online (Sandbox Code Playgroud)

当我将目录更改为时,/project我得到输出:

direnv: loading .envrc
direnv: export +VIRTUAL_ENV -PS2 ~PATH
Run Code Online (Sandbox Code Playgroud)

它将 env 目录添加到我的 PATH 环境变量中,因此当我运行时which pythonwhich pip它们都指向我env目录中的python 和 pip

=> which python
/USER/project/env/bin/python
=> which pip
/USER/project/env/bin/pip
Run Code Online (Sandbox Code Playgroud)

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

zim*_*atm 8

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

这里发生的事情是:

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

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

在实践中,激活工作如您所见。python 在正确的路径中并且正在运行pipeasy_install将要在 virtualenv 中安装东西。不需要停用,因为 direnv 会在cd退出目录时自动卸载环境。

要恢复自定义提示,维基上有更多可用信息:https : //github.com/direnv/direnv/wiki/Python#restoreing-the-ps1

  • 很好的答案...@Ephapox direnv 可以满足您的需求!请参阅:https://github.com/direnv/direnv/wiki/Python (2认同)

Ant*_*lix 5

在 direnv 中有一个“隐藏”功能可以做你想做的事。您必须查看direnv 加载的工具箱以供您在.envrc文件中使用。您可以使用layout带有 python ( layout python3)的命令在进入目录时激活 virtualenv,并在退出目录时停用它。它甚至会负责第一次创建 virtualenv。

还要看看在文件系统source_up中保持加载.envrc更高的文件。我通过创建一个.envrc包含以下内容的文件来开始我的所有项目:

layout python3
source_up
Run Code Online (Sandbox Code Playgroud)

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