使用poetry来管理python项目

使用poetry来管理python项目,快速的构建开发环境,快速的发布,以及进行第三方库的依赖管理。

1.背景

Poetry 是一个Python 中的好用的包管理工具。在 Python 中,打包系统和依赖管理非常复杂:一个项目经常要同时创建多个文件,例如:

  • setup.py
  • requirements.txt
  • setup.cfg
  • MANIFEST.in
  • Pipfile

基于此, poetry 将所有的配置都放置在一个 toml 文件中,包括:依赖管理、构建、打包、发布等,可谓是简单方便。

2. 安装

  1. 环境:windows10 + Python 3.8.10 + Python 2.7

  2. pipx 或者 pip 进行安装:

    1
    2
    pipx install poetry  ---推荐
    pip install poetry
  3. 配置全局环境变量(可选,只是为更好的使用)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    打开cmd窗口

    1.查看当前的poetry环境变量:
    $ poetry config --list

    cache-dir = "C:\\Users\\zmr\\AppData\\Local\\pypoetry\\Cache"
    experimental.new-installer = true
    installer.parallel = true
    virtualenvs.create = true
    virtualenvs.in-project = false
    virtualenvs.path = "{cache-dir}\\virtualenvs" # C:\\Users\\zmr\\AppData\\Local\\pypoetry\\Cache\\virtualenvs
    配置项说明
    cache-dirpoetry使用的缓存目录的路径 默认值: macOS: ~/Library/Caches/pypoetry Windows: C:\Users< username >\Appdata\Local\pypoetry\Cache Unix: ~/.cache/pypoetry
    virtualenvs.create默认值为true,如果执行 poetry install/poetry add时没有虚拟环境,就自动创建一个虚拟环境,设置为false的话,当虚拟环境不存在时,会将包安装到系统环境
    virtualenvs.in-project默认值为false,设置为true的话,会在当前项目目录下创建虚拟环境
    virtualenvs.path虚拟环境的路径,默认路径 {cache-dir}\virtualenvs

    根据需求做以下的调整

    1
    2
    3
    4
    5
    1. 更改缓存目录到其他盘,避免C盘占用
    $ poetry config cache-dir E:\TEMP\cache\poetry\cache

    2.更改为在当前位置创建虚拟环境,更容易管理
    $ poetry config virtualenvs.in-project true
  4. 确认更改是生效的

    1
    2
    3
    4
    5
    6
    7
    8
    $ poetry config --list

    cache-dir = "E:\\TEMP\\cache\\poetry\\cache"
    experimental.new-installer = true
    installer.parallel = true
    virtualenvs.create = true
    virtualenvs.in-project = true
    virtualenvs.path = "{cache-dir}\\virtualenvs" # E:\TEMP\cache\poetry\cache\virtualenvs

3. 基本使用

3.1 添加poetry管理

  1. 已有的项目,直接在当前项目的根目录执行poetry init即能根据你回答的问题生成pyproject.toml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [tool.poetry]
    name = "demo"
    version = "0.1.0"
    description = ""
    authors = ["xxx <xxx@126.com>"]

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

    [tool.poetry.dev-dependencies]

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

  2. 如果你想创建一个新的 Python 项目,使用 poetry new <文件夹名称>命令可以创建一个项目模板:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ poetry new foo

    这会创建一个这样的项目结构:
    foo
    ├── pyproject.toml
    ├── README.rst
    ├── foo
    │ └── __init__.py
    └── tests
    ├── __init__.py
    └── test_foo.py
  • 注:如果你想使用 src 文件夹,可以添加 --src选项,这会把程序包嵌套在 src 文件夹里。

3.2 创建虚拟环境

  1. 使用 poetry install命令创建虚拟环境(确保当前目录有 pyproject.toml 文件):

    1
    poetry install

    如果系统中既有Python2又有Python3,且项目既支持Python2也支持Python3,那poetry会优先使用Python2。

  2. 利用 poetry env use创建

    这个命令,可以指定创建虚拟环境时使用的Python解释器版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ poetry env use python2

    查看当前的环境信息
    $ poetry env info

    Virtualenv
    Python: 2.7.10
    Implementation: CPython
    Path: E:\git-code\behave-db\.venv
    Valid: True

    System
    Platform: win32
    OS: nt
    Python: d:\program files\python27

3.3 安装包、卸载包

使用 poetry add 命令来安装一个包:

1
2
3
4
5
6
7
8
9
安装包
$ poetry add flask

执行完成后,会自动加到 pyproject.toml 中,下次直接install的时候就自动包含了flask

卸载包
$ poetry remove foo

会将其从 pyproject.toml 中移除

3.4 锁定依赖

1
2
3
$ poetry lock

会锁定当前使用的所有依赖的版本,生成一个poetry.lock

3.4 激活虚拟环境

1
poetry shell

3.5 删除环境

1
poetry env remove python3.7

3.6 build:构建

1
2
3
$ poetry build

会打包当前的py项目,并放到dist目录中

3.7 publish:发布到仓库

1
2
3
4
5
6
7
8
9
10
11
12
将使用build命令生成的包发布到远程仓库,默认上传至PYPI

$ poetry publish


# 需要输入PYPI的用户名和密码
Username: xxxx
Password:
Publishing py-sanic-samples (0.1.0) to PyPI
- Uploading py-sanic-samples-0.1.0.tar.gz 100%
- Uploading py_sanic_samples-0.1.0-py3-none-any.whl 100%

4. pyproject.toml 配置文件的基本说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 设置 PyPI 镜像源,默认是走的pip的pip.ini设置的来源
[[tool.poetry.source]]
name = "douban"
url = "https://pypi.doubanio.com/simple/"


[tool.poetry.dependencies]
# 使用git仓库:
requests = { git = "https://github.com/requests/requests.git" }

# 使用本地路径:
# directory
my-package = { path = "../my-package/", develop = false }

# file
my-package = { path = "../my-package/dist/my-package-0.1.0.tar.gz" }

# URL
my-package = { url = "https://example.com/my-package-0.1.0.tar.gz" }


[tool.poetry.dependencies]
# python限制:
pathlib2 = { version = "^2.2", python = "~2.7" }

# 指定版本和运行环境
pathlib2 = { version = "^2.2", markers = "python_version ~= '2.7' or sys_platform == 'win32'" }

# 根据py版本来选择版本
foo = [
{version = "<=1.9", python = "^2.7"},
{version = "^2.0", python = "^3.4"}
]

# 如果限制很多,也可单独写一个模块
[tool.poetry.group.dev.dependencies.black]
version = "19.10b0"
allow-prereleases = true
python = "^3.6"
markers = "platform_python_implementation == 'CPython'"