📜  使用direnv和pyenv管理Python环境

📅  最后修改于: 2020-08-03 04:49:57             🧑  作者: Mango

介绍

作为Python开发人员,我们大多数人都熟悉Virtual Environments。在进行新项目时,我们要做的第一件事就是创建环境。我们通常完全出于此目的使用virtualenvvenv

我们从事的每个项目都使用不同的软件包,甚至可能仅与一个Python版本兼容。

重复做某事可保证自动化。在本文中,我们将看到如何direnv并且pyenv可以帮助我们做到这一点。

附带说明一下,一些现代IDE已自动执行这些步骤。例如,PyCharm将在初始化项目时创建虚拟环境:

尽管如果使用支持此类功能的IDE自动化所有这些步骤将是一个巨大的胜利,但是更通用的解决方案应该与IDE无关。

虚拟环境的问题

想象一下,我们在GitHub上找到了一个项目,并且我们想尝试一下。Pyweather是一个简单的脚本,它请求我们提供扩展的天气预报,并将其打印在终端上。

这些是我们为了在我们的计算机上尝试脚本而采取的步骤:

$ git clone https://github.com/lcofre/pyweather.git
$ cd pyweather

然后,我们创建虚拟环境并安装脚本使用的软件包:

$ virtualenv --python=python3 env
$ source env/bin/activate
(env) $ pip install requirements.txt

只有这样,我们才能执行脚本:

(env) $ ./pyweather.py	

我们创建了一个虚拟环境,并将其保存在项目的根文件夹中。在该文件夹上时,我们必须使用source命令激活环境。

完成工作后,需要通过执行deactivate以下操作退出虚拟环境:

(env) $ deactivate

 

所有这些步骤是我们的责任。我们可能忘记了多少次激活环境并在全球范围内安装了软件包!

让我们看看如何direnv帮助我们实现这一目标。

Direnv

direnv 主要用于加载环境变量,具体取决于当前目录,并且具有许多shell的扩展名。

在此示例中,我们将使用using bash,但也direnv支持许多其他shell。对于我们而言更重要的是,它允许我们管理Python虚拟环境

要安装它,我们将运行bash他们提供的安装程序。我们可以使用发行版的软件包管理器,但是bash安装程序将确保我们安装可用的最新版本:

$ curl -sfL https://direnv.net/install.sh | bash

现在,我们需要挂钩direnvbash。我们将进行编辑~/.bashrc,然后重新加载它:

$ echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
$ source ~/.bashrc

这种方式direnv将自身链接到外壳,并且总是在每个提示之前执行。我们永远不会注意到它在后台运行。

direnv将检查是否需要在当前文件夹中加载某些内容。它检查是否存在名为的文件.envrc,并提供有关应加载内容的说明。

要加载Python虚拟环境,我们运行以下layout命令,然后是Python版本:

$ echo 'layout python' > .envrc

或者,如果我们想使用Python 3:

$ echo 'layout python3' > .envrc

运行这些命令将告诉direnv您在路径上查找pythonpython3可执行文件。

创建.envrc文件后,将立即警告您需要允许direnv访问该文件夹。现在就开始做吧:

$ direnv allow
direnv: loading .envrc
...
New python executable in /home/myuser/untitled/.direnv/python-3.6.9/bin/python3
...
Installing setuptools, pkg_resources, pip, wheel...direnv:
done.
direnv: export +VIRTUAL_ENV ~PATH

从输出中可以看到,虚拟环境立即被创建。提示没有被修改,因此我们不会在开始时看到环境的名称。

现在,我们可以像在上一节中创建的环境中那样安装所需的软件包:

$ pip install -r requirements.txt

direnv将在后台静默激活环境。每当我们移出目录时,环境都会被停用:

$ cd ..
direnv: unloading

如果我们可以使用系统上安装的任何Python版本,则只direnv需要这些即可。

现在假设我们的pyweather脚本需要一个非常特定的版本。

pyenv

pyenv是Python的版本管理实用程序。除其他事项外,它允许在每个项目的基础上更改Python版本。direnv从version开始提供对此版本的支持2.21.0,因此它们可以一起为我们在环境中使用的版本提供更高级别的控制。

让我们从安装开始pyenv

$ curl -L https://pyenv.run | bash

然后确保我们的终端始终可以访问它:

$ echo 'export PATH="~/.pyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
$ source ~/.bashrc

 

现在,假设我们的pyweather脚本需要一个非常特定的Python版本3.6.2

首先,我们需要安装该版本的Python:

$ pyenv install 3.6.2

现在我们可以将项目配置为使用特定版本:

$ echo 'layout pyenv 3.6.2' > .envrc
$ direnv allow

我们可以通过检查环境中的Python版本来确认所有工作是否正常:

$ python --version
Python 3.6.2

如果我们需要更改Python版本,那么更改.envrc文件的布局就足够了。

借助这两个实用程序,我们可以将布局更改为任何Python版本,并且我们的虚拟环境将立即更新。

同时使用direnv和的另一个优势pyenv是我们可以.envrc在项目存储库中对文件进行版本控制。

这样,只要他们安装所需的实用程序和Python版本,所有贡献者都将能够按照项目的意图配置其环境。

 

结论

虚拟环境是从Python开发工作流程中分离出来的。在处理我们的项目之前,我们需要记住配置和激活它。多亏了direnvpyenv我们可以自动化所有这些,进入项目文件夹将在后台为我们完成所有工作。

两种实用程序的安装都不是一件容易的事,但是一旦完成安装,我们将节省很多时间。我们还将始终确定我们正在使用正确的虚拟环境和Python版本。