首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用direnv激活virtualenv不会激活virtualenv

使用direnv激活virtualenv不会激活virtualenv
EN

Stack Overflow用户
提问于 2018-09-21 13:59:30
回答 2查看 4.5K关注 0票数 2

当我切换到目录时,我使用direnv作为我的virtualenv的源码。

代码语言:javascript
运行
复制
/project
   .envrc
   /env <--- my virtualenv

.envrc

代码语言:javascript
运行
复制
source env/bin/activate

当我将目录切换到/project时,会得到以下输出:

代码语言:javascript
运行
复制
direnv: loading .envrc
direnv: export +VIRTUAL_ENV -PS2 ~PATH

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

代码语言:javascript
运行
复制
=> 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的新手,所以我不确定是否有现有的工具来做这样的事情。

EN

回答 2

Stack Overflow用户

发布于 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在正确的路径上,运行pipeasy_install将在virtualenv中安装一些东西。不需要停用,因为当cd-ing从目录中移出时,direnv会自动卸载环境。

要恢复自定义提示符,请访问维基:https://github.com/direnv/direnv/wiki/Python#restoring-the-ps1

票数 8
EN

Stack Overflow用户

发布于 2020-01-15 22:35:27

在direnv中有一个“隐藏”的特性来做你想做的事情。为了在.envrc文件中使用,您必须查看由direnv加载的toolbox。您可以使用带有python (layout python3)的layout命令在进入目录时激活一个虚拟环境,并在退出目录时将其停用。它甚至会在第一次创建virtualenv。

另外,看看在文件系统中加载.envrc文件的位置更靠前的source_up。我通过创建一个包含以下内容的.envrc文件开始我的所有项目:

代码语言:javascript
运行
复制
layout python3
source_up

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52437468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档