【问题标题】:activating virtualenv with direnv doesn't activate virtualenv使用 direnv 激活 virtualenv 不会激活 virtualenv
【发布时间】:2018-09-21 05:59:29
【问题描述】:

当我切换到目录时,我正在使用 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 pythonwhich 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


    【解决方案1】:

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

    这里发生的事情是:

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

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

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

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

    【讨论】:

    • 您知道有哪些工具可以满足我的需求吗?在目录更改时进入/退出 python virtualenv
    • 很好的答案...@Ephapox direnv 做你想做的事!见:github.com/direnv/direnv/wiki/Python
    【解决方案2】:

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

    还可以查看source_up,它会在文件系统中不断加载.envrc 文件。我通过使用以下内容创建一个 .envrc 文件来开始我的所有项目:

    layout python3
    source_up
    

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

    【讨论】:

    猜你喜欢
    • 2013-09-13
    • 2018-06-25
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2016-02-23
    • 2010-12-14
    相关资源
    最近更新 更多