用direnv激活virtualenv不会激活virtualenv

时间:2018-09-21 05:59:30

标签: python virtualenv direnv

当我进入目录时,我正在使用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。我希望它通过在我的CLI提示符中添加virtualenv名称(env)来激活我的virtualenv,并授予对deactivate命令的访问权限,但都不会发生。关于direnv和virtualenv的工作方式,我有误解吗?我是python的新手,所以我不确定是否有现有的工具可以执行此类操作。

2 个答案:

答案 0 :(得分:3)

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

这里发生的是:

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

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

实际上,激活已按照您的注意进行。 python在正确的路径中,运行pipeasy_install将在virtualenv中安装东西。不需要取消激活,因为当cd移出目录时,direnv会自动卸载环境。

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

答案 1 :(得分:3)

有一个“隐藏”功能可以执行direnv中您想要的操作。您必须看一下direnv加载的toolbox,以便在.envrc文件中使用。您可以将layout命令与python(layout python3)配合使用,以在输入目录时激活virtualenv,并在退出目录时将其停用。甚至会自动创建virtualenv。

还要看看source_up,该文件将.envrc个文件继续加载到文件系统中。我通过创建带有以下内容的.envrc文件来开始所有项目:

layout python3
source_up

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