依赖管理

阅读 42

Python 项目中需要用到优秀的第三方库,该怎么处理呢?下载代码放到项目中?Python 提供了依赖管理工具 pip。在安装好的 Python 之后,同时也安装了 pip。结合上一篇的虚拟环境能够发挥出最佳效果。

pip

直接在 PowerShell 或者终端中输入 pip,检查命令是否能够使用,如果没有出现使用帮助信息,则需要检查 Python 安装的是否完整。

Python 官方维护了 Python 包索引网站(https://pypi.org),方便 Python 用户发布和使用库。开发者把库发布到 PyPi,用户从 PyPi 下载库。而 pip 就是自动实现发布和下载 PyPi 中库的工具。

现在想要做 Web 开发,想用知名的框架 flask,只需要使用以下命令,就能自动下载 flask 和 flask 依赖的库。

➜  pip install flask

如果想要看当前环境有哪些库以及对应的版本,执行命令:

➜  pip list                 
Package      Version
------------ -------
click        7.1.2
Flask        1.1.2
itsdangerous 1.1.0
Jinja2       2.11.2
MarkupSafe   1.1.1
pip          20.2.3
setuptools   47.1.0
Werkzeug     1.0.1

安装时也可以指定版本:

➜  pip install requests==2.0.0

如果版本过于老旧,会影响程序的性能和安全性,需要升级。执行命令:

➜  pip install -U requests 
➜  pip list     
Package      Version
------------ ---------
certifi      2020.6.20
chardet      3.0.4
click        7.1.2
Flask        1.1.2
idna         2.10
itsdangerous 1.1.0
Jinja2       2.11.2
MarkupSafe   1.1.1
pip          20.2.3
requests     2.24.0
setuptools   47.1.0
urllib3      1.25.10
Werkzeug     1.0.1

对于开发 web 网站来说,requests 库暂时用不到,需要卸载。执行命令:

➜  pip uninstall requests
Found existing installation: requests 2.24.0
Uninstalling requests-2.24.0:
  Would remove:
    /Users/tiankong/test/app/venv/lib/python3.8/site-packages/requests-2.24.0.dist-info/*
    /Users/tiankong/test/app/venv/lib/python3.8/site-packages/requests/*
Proceed (y/n)? y
  Successfully uninstalled requests-2.24.0

如果现在安装一个大型库,由于 PyPi 服务器在国外,速度可能比较慢,推荐使用国内的镜像地址。知名的有清华https://pypi.tuna.tsinghua.edu.cn/simple、阿里云 https://mirrors.aliyun.com/pypi/simple/ 等镜像。

临时使用:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

设为默认值(推荐):

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

这样,以后下载库速度会快很多。

但是,对于大型项目,多人协作,A 添加的依赖,B 不知道怎么办呢?这就要用到 requirements.txt 文件。在项目中添加一个名为 requirements.txt 的文件,把依赖按照指定的格式写好。A 添加的依赖,B 看到之后就能直接安装了。

A 在 requirements.txt 中添加:

requests==2.24.0
Jinja2==2.11.2

B 直接执行下面命令,就能直接安装所有依赖库。

pip install -r requirements.txt

如果开始时没有使用 requirements.txt,可以使用下面命令生成当前环境的依赖库列表:

pip freeze > requirements.txt

Poetry

pip 简单实用,而且是 Python 安装包的一部分,应用比较广泛。现在,人们逐渐发现 pip 有一些缺点,会使得环境中的出现依赖库不一致、依赖冲突等问题,

这时,就要用到新工具 poetry (https://python-poetry.org),poetry 完美解决了这些问题。在新项目中应该优先使用 poetry。peotry 同样是使用 PyPi 仓库管理,不会对项目造成破坏。

poetry 还会自动创建虚拟环境。

Windows 安装 poetry:

在 PowerShell 中执行:

(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python -

Mac/Linux 安装 poetry:

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

或者,直接使用 pip 安装 poetry,应为 poetry 也是一个发布到 PyPi 的库。

pip install poetry
poetry --version

在项目中使用 poetry new <project name> ,初始化项目,比如。

poetry new apps

创建 虚拟环境:

poetry install

如果项目已经创建,可以交互的设置项目名称、版本、依赖等信息:

➜  poetry init

This command will guide you through creating your pyproject.toml config.

Package name [app]:
Version [0.1.0]:
Description []:
Author [tktk <tk@email.com>, n to skip]:
License []:
Compatible Python versions [^3.9]:

Would you like to define your main dependencies interactively? (yes/no) [yes] yes
You can specify a package in the following forms:
  - A single name (requests)
  - A name and a constraint (requests@^2.23.0)
  - A git url (git+https://github.com/python-poetry/poetry.git)
  - A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop)
  - A file path (../my-package/my-package.whl)
  - A directory (../my-package/)
  - A url (https://example.com/packages/my-package-0.1.0.tar.gz)

Search for package to add (or leave blank to continue): requests
Found 20 packages matching requests

Enter package # to add, or the complete package name if it is not listed:
 [0] requests
 [1] requests2
 [2] requests5
 [3] requests3
 [4] play-requests
 [5] requests_viewer
 [6] pycopy-requests
 [7] pg_requests
 [8] requests-cloudkit
 [9] requests-middleware
 > 0
Enter the version constraint to require (or leave blank to use the latest version):
Using version ^2.24.0 for requests

Add a package:

Would you like to define your development dependencies interactively? (yes/no) [yes] no
Generated file

[tool.poetry]
name = "app"
version = "0.1.0"
description = ""
authors = ["tktk <tk@email.com>"]

[tool.poetry.dependencies]
python = "^3.9"
requests = "^2.24.0"

[tool.poetry.dev-dependencies]

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


Do you confirm generation? (yes/no) [yes] yes

最终生成一个 pyproject.toml 文件。

如果想要继续添加依赖,使用命令 poetry add <package-name>, 例如:

poetry add flask

如果项目到了发布阶段,希望本地环境、测试环境、正式环境依赖一致,可以锁定项目依赖,执行 lock 命令,生成 poetry.lock 文件。

poetry lock

poetry 还可以自动发布项目到 PyPi,赶快自己探索一下吧。