当我切换到目录时,我使用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提示符并提供对deactivate命令的访问来激活我的virtualenv,但这两种情况都不会发生。我是不是对direnv和virtualenv的工作方式有什么误解?我是python的新手,所以我不确定是否有现有的工具来做这样的事情。
发布于 2018-09-23 01:24:46
我认为首先要理解direnv是如何工作的以形成一个合适的心理模型,这一点很重要;direnv不会直接将.envrc加载到当前shell中。相反,它启动一个新的bash shell,执行其中的.envrc,记录环境中的更改,并将diff bash导出到当前shell中。
这里发生的情况是:
virtualenv正在使用$PS1设置提示符。这是一个局部变量,因此不会重新导出。direnv还会过滤PS1,因为它会在旧的macOS bash未设置时导致段错误。
deactivate()函数不是从bash子shell导出的,因为它不是一个环境变量。
实际上,激活就像你注意到的那样。python在正确的路径上,运行pip或easy_install将在virtualenv中安装一些东西。不需要停用,因为当cd-ing从目录中移出时,direnv会自动卸载环境。
要恢复自定义提示符,请访问维基:https://github.com/direnv/direnv/wiki/Python#restoring-the-ps1
发布于 2020-01-15 22:35:27
在direnv中有一个“隐藏”的特性来做你想做的事情。为了在.envrc文件中使用,您必须查看由direnv加载的toolbox。您可以使用带有python (layout python3)的layout命令在进入目录时激活一个虚拟环境,并在退出目录时将其停用。它甚至会在第一次创建virtualenv。
另外,看看在文件系统中加载.envrc文件的位置更靠前的source_up。我通过创建一个包含以下内容的.envrc文件开始我的所有项目:
layout python3
source_up这将自动创建、激活和停用python virtualenv,并继续从更高级别的.envrc文件中读取变量。当前项目的环境变量将只放在本地.envrc中。
https://stackoverflow.com/questions/52437468
复制相似问题