1.Python依赖和环境管理

配置好一个舒适稳定的编程环境,对于小白来说是一个相对痛苦的过程。对于Python编程环境,难度还行,不是很大,但接下来就需要经历一个更加困难的过程,即如何为多个Python项目管理多个环境。一些项目可能是新的,而另一些则可能是十年前的陈旧代码。幸运的是,有许多工具可以帮助我们简化依赖关系和环境管理。

在本篇中,我们将回顾可用的依赖关系和工作环境管理工具,以解决以下问题:

  • 在同一台机器上安装和切换不同版本的Python
  • 管理依赖关系和虚拟环境
  • 复制环境

1 安装 python

虽然我们可以从官方二进制文件或使用系统的包管理器下载和安装Python,但是我们应该避免使用这些方法,除非我们会在当前和以后的所有项目中都使用相同版本的Python。因为大概不太可能是这样,所以我们建议用pyenv安装Python。

pyenv是一种简化在同一台机器上安装和切换不同版本Python的工具。它保持了Python的系统版本完好无损,这是某些操作系统正常运行所必需的,同时还可以根据特定项目的需求轻松地切换Python版本。

不幸的是,pyenv不能在Windows系统使用,除非搭建了WSL,或者用pyenv-win代替。

安装好以后,我们可以轻松安装指定版本的python:

$ pyenv install 3.8.5
$ pyenv install 3.8.6
$ pyenv install 3.9.0

$
 pyenv versions
* system
  3.8.5
  3.8.6
  3.9.0

然后我们可以设置全局Python版本:

$ pyenv global 3.8.6

$
 pyenv versions
  system
  3.8.5
* 3.8.6 (set by /Users/JKL/.pyenv/version)
  3.9.0

$
 python -V
Python 3.8.6

然后我们就可以为指定文件夹设置指定Python版本了,比如为我们的项目指定Python3.9:

$ pyenv local 3.9.0

$
 pyenv versions
  system
  3.8.5
  3.8.6
* 3.9.0 (set by /Users/JKL/Desktop/helloworld/.python-version)

$
 python -V
Python 3.9.0

2 依赖管理

在本节中,我们将介绍几种用于管理依赖项和虚拟环境的工具。

  1. venv + pip
  2. poetry
  3. pipenv

venvpip是大部分Python版本都内置的包,使用非常简单。个人建议,使用poetrypipenv管理项目更好,poetrypipenv相差不大,本文只介绍poetry

poetry可以说是Python最富特性的依赖关系管理工具。它附带了一个功能强大的CLI,用于创建和管理Python项目。安装后,要构建新项目运行的脚手架,请执行以下操作:

$ poetry new sample-project
$ cd sample-project

然后会产生以下文件夹和文件:

sample-project
├── README.rst
├── pyproject.toml
├── sample_project
│   └── __init__.py
└── tests
    ├── __init__.py
    └── test_sample_project.py

依赖会通过一个pyproject.toml的文件进行管理:

[tool.poetry]
name = "sample-project"
version = "0.1.0"
description = ""
authors = ["JKL <JKL@123.com>"]

[tool.poetry.dependencies]
python = "^3.8"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

通过以下命令添加新依赖:

$ poetry add [--dev] <package name>

--dev标志表示依赖关系仅用于开发模式。默认情况下不安装开发依赖项。

举个例子:

$ poetry add flask

这将在poetry管理的虚拟环境中从PyPI下载并安装flask,并将其与所有子依赖项一起添加到poetry.lock文件,并自动将其(顶级依赖项)添加到pyproject.toml:

[tool.poetry.dependencies]
python = "^3.8"
flask = "^1.1.2"

要在虚拟环境中运行命令,请在命令前面加上poetry run。例如,例如使用pytest运行测试:

$ poetry run python -m pytest

poetry run <command>将在虚拟环境中运行命令。不过,它不会激活虚拟环境。要激活poetry的虚拟环境,需要运行poetry shell。要停用它,只需运行exit命令。因此,您可以在处理项目之前激活虚拟环境,并在完成后停用,或者可以在整个开发过程中使用poetry run <command>

最后,poetrypyenv可以配合得很好。

3 其他工具

除了上述工具之外,还可以了解以下工具,以获得在同一台计算机上安装和切换不同版本的Python、管理依赖项和虚拟环境以及复制环境的帮助:

  1. Docker是一个用于构建、部署和管理容器化应用程序的平台。它非常适合创造可复制的环境。
  2. Conda在数据科学和机器学习社区非常流行,它可以帮助管理依赖关系、虚拟环境以及复制环境。
  3. 当您需要简化虚拟环境之间的切换并在一个地方管理它们时,pyenv的插件virtualenvwrapperpyenv virtualenv,是值得一看的。
  4. pip-tools简化了依赖性管理和环境可再现性。它经常与venv结合使用。

4 管理项目

让我们看看怎么通过pyenvpoetry来管理一个flask项目的。

首先,创建一个新文件夹并进入其中:

$ mkdir flask_example
$ cd flask_example

然后用pyenv设置Python环境版本:

$ pyenv local 3.8.6

接着,使用poetry初始化项目:

$ poetry init
Package name [flask_example]:
Version [0.1.0]:
Description []:
Author [Your name <your@email.com>, n to skip]:
License []:
Compatible Python versions [^3.7]:  >3.7

Would you like to define your main dependencies interactively? (yes/no) [yes] no
Would you like to define your development dependencies interactively? (yes/no) [yes] no
Do you confirm generation? (yes/no) [yes]

添加flask, 开发环境添加pytest:

$ poetry add flask
$ poetry add --dev pytest

现在一个基本环境已经搭起来了,我们可以写个api测试,添加一个test_app.py文件:

import pytest
from app import app

@pytest.fixture
def client():
    app.config['TESTING'] = True
    with app.test_client() as client:
        yield client


def test_health_check(client):
    response = client.get('/health-check/')

    assert response.status_code == 200

之后,添加一个app.py文件:

from flask import Flask

app = Flask(__name__)

@app.route('/health-check/')
def health_check():
    return 'OK'


if __name__ == '__main__':
    app.run()

跑测试:

$ poetry run python -m pytest

运行:

$ poetry run python -m flask run

5 总结

本文介绍了解决依赖关系和环境管理方面的问题:

  • 在同一台机器上安装和切换不同版本的Python
  • 管理依赖关系和虚拟环境
  • 复制环境

本文挑选了一些工具进行介绍,让我们可以轻松地用Python进行开发。它们的存在使我们的日常开发工作流程变得更简单,这样我们就可以尽可能地提高工作效率。当然这是非强制性的,尝试所有这些工具,并使用符合我们开发风格的方法,才是最重要的。

更多文档请参考 www.testdriven.io[1]

参考资料

[1]

更多文档: https://testdriven.io/blog/python-environments

 wechat
您的支持将鼓励我继续创作!
您的支持将鼓励我继续创作!
--------------本文结束,感谢您的阅读--------------