虚拟环境:python -m venv VS echo layout python3

Virtual Environments: python -m venv VS echo layout python3

我是 python 的新手,但已经构建了一些小项目。我被教导并一直使用以下命令来启动虚拟环境:echo layout python3 > .envrc 然后是 direnv allow.

使用 python -m venv <virtualenv name>echo layout 有何区别或优势?

这两个命令做完全不同的事情。

venv

python -m venv <env_name> 命令 creates a virtual environment 作为文件系统中充满文件的子目录。完成后,一个新的虚拟环境已准备好供您激活和使用,但此命令实际上尚未 激活

激活虚拟环境以便您可以使用这是一个单独的步骤。执行此操作的命令取决于您使用的操作系统和 shell(请参阅上面链接的文档中的 "Command to activate virtual environment" table)。

激活命令仅改变您的当前命令行shell会话。这就是为什么您必须在每次启动的 shell 会话中重新激活虚拟环境。这种烦恼也是direnv存在要解决的

direnv.envrc

首先,关于 echo 命令...

在 MS-DOS 和 Unix / Linux(以及可能是最新版本的 Macintosh)中,echo layout python3 只是发出一个字符串 "layout python3".

>echo 命令的输出重定向到文件,在本例中为 .envrc。如果文件不存在,重定向将创建该文件,然后用该字符串替换其内容(如果有)。最终结果是您当前工作目录中的一个文件仅包含:

layout python3

.envrc 文件,以及 direnv allow

.envrcdirenv 应用程序使用的配置文件。每当您 cd 进入包含 .envrc 文件的目录时,direnv 会读取它并执行在其中找到的 direnv 指令。

direnv allow 是一项安全功能。由于恶意 .envrc 文件几乎可以隐藏在任何地方(尤其是在 world-writable 目录中,如 /var/tmp/),你可以 cd 进入一个看似无辜的目录并得到一个令人讨厌的惊喜来自别人的 .envrc 地雷。 allow 命令专门将目录的 .envrc 文件列入白名单,如果发现 .envrc 文件自 allowed 以来发生了更改,则显然会取消列出该文件。

最后,回到direnv

我不使用 direnv,但 layout <language> 是一个 direnv 命令来调整你的环境以使用 语言 进行开发,在本例激活一个 Python 3 虚拟环境。文档暗示它 "helpful" 不止于此,但他们没有详细说明。 (另外,您可以编写自己的 direnv 函数,调用 python3 来做一些完全不同的事情。)

所有这些的目标是在您 cd 进入其目录后立即自动启用您的 Python 虚拟环境。这消除了一种人为错误,即忘记启用虚拟环境。有关详细信息,请参阅 Richard North 的“Practical direnv", especially the "Automatic Python virtualenv switching 部分。

(Dis-)优点和意见

如果这是您经常犯的那种错误,您相信 direnv 命令永远不会成为恶意 .envrc 的牺牲品文件(或者 "helpfully" 弄乱你正在处理的东西),那么它对你来说可能是值得的。

我看到 direnv 最大的缺点(除了安全隐患)是 它会让你忘记使用 [=] 的重要步骤 115=] 虚拟环境...即,实际上 使用 虚拟环境。对于它在不告诉您的情况下默默提供的任何其他 "help",这会增加一倍。 (我一直把 "help" 放在引号中的事实应该表明我对这样的实用程序的看法。)

如果您发现自己在某处工作时未安装 direnv,您很可能会忘记激活您的虚拟环境,或者忘记 direnv 一直在做的任何其他事情你。而且您忘记 如何 的可能性更大。