📅  最后修改于: 2020-08-03 04:49:57             🧑  作者: Mango
作为Python开发人员,我们大多数人都熟悉Virtual Environments。在进行新项目时,我们要做的第一件事就是创建环境。我们通常完全出于此目的使用virtualenv或venv。
我们从事的每个项目都使用不同的软件包,甚至可能仅与一个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
主要用于加载环境变量,具体取决于当前目录,并且具有许多shell的扩展名。
在此示例中,我们将使用using bash
,但也direnv
支持许多其他shell。对于我们而言更重要的是,它允许我们管理Python虚拟环境。
要安装它,我们将运行bash
他们提供的安装程序。我们可以使用发行版的软件包管理器,但是bash
安装程序将确保我们安装可用的最新版本:
$ curl -sfL https://direnv.net/install.sh | bash
现在,我们需要挂钩direnv
到bash
。我们将进行编辑~/.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
您在路径上查找python
或python3
可执行文件。
创建.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
是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开发工作流程中分离出来的。在处理我们的项目之前,我们需要记住配置和激活它。多亏了direnv
,pyenv
我们可以自动化所有这些,进入项目文件夹将在后台为我们完成所有工作。
两种实用程序的安装都不是一件容易的事,但是一旦完成安装,我们将节省很多时间。我们还将始终确定我们正在使用正确的虚拟环境和Python版本。