Posted on May 21, 2019· Updated on July 3, 2022

使用 Poetry 和 VSCode 的 Python 项目 第三部分 - Python 速查表

#python #intermediate #vscode #packaging
Image for 使用 Poetry 和 VSCode 的 Python 项目 第三部分 - Python 速查表

第一篇文章中,我们启动了一个新项目,创建了虚拟环境并管理了依赖项。在第二部分中,我们将虚拟环境添加到了 VSCode 并集成了我们的开发依赖项。

最后,在这第三也是最后一部分中,我们将:

  • 编写一个示例库。
  • 使用 Poetry 构建我们的项目。
  • 将其发布到 PyPI

Poetry 命令

下表列出了本系列中使用的命令及其描述。有关完整列表,请阅读 Poetry 文档

命令描述
poetry new [package-name]启动一个新的 Python 项目。
poetry init以交互方式创建 pyproject.toml 文件。
poetry install安装 pyproject.toml 文件中的包。
poetry add [package-name]将包添加到虚拟环境中。
poetry add -D [package-name]将开发包添加到虚拟环境中。
poetry remove [package-name]从虚拟环境中移除包。
poetry remove -D [package-name]从虚拟环境中移除开发包。
poetry update获取依赖项的最新版本
poetry shell在虚拟环境中生成一个 shell。
poetry build构建源代码和 wheel 归档文件。
poetry publish将包发布到 PyPI。
poetry publish --build构建并发布包。
poetry self:update将 poetry 更新到最新的稳定版本。

项目

如果您愿意,可以从 GitHub 下载源代码,但如前所述,这将是一个简单的装饰器,它会在控制台打印函数运行所需的时间。

它的工作方式如下:

from how_long import timer

@timer
def test_function():
    [i for i in range(10000)]

test_function()
# Execution Time: 955 ms.

项目目录结构如下:

how-long
├── how_long
│   ├── how_long.py
│   └── __init__.py
├── how_long.egg-info
│   ├── dependency_links.txt
│   ├── PKG-INFO
│   ├── requires.txt
│   ├── SOURCES.txt
│   └── top_level.txt
├── LICENSE
├── poetry.lock
├── pyproject.toml
├── README.rst
└── tests
    ├── __init__.py
    └── test_how_long.py

在开始之前,请使用 poetry update 命令检查包更新:

poetry update

README.rst 中为项目添加简短描述:

how_long
========

Simple Decorator to measure a function execution time.

Example
_______

.. code-block:: python

    from how_long import timer

    @timer
    def some_function():
        return [x for x in range(10_000_000)]

导航到 how_long/how_long.py

# how_long.py
from functools import wraps

import pendulum

def timer(function):
    """
    Simple Decorator to measure a function execution time.
    """

    @wraps(function)
    def function_wrapper():
        start = pendulum.now()
        function()
        elapsed_time = pendulum.now() - start
        print(f"Execution Time: {elapsed_time.microseconds} ms.")

    return function_wrapper

how_long/__init__.py 中:

from .how_long import timer

__version__ = "0.1.1"

最后是 tests/test_how_long.py 文件:

from how_long import __version__
from how_long import timer

def test_version():
    assert __version__ == "0.1.1"

def test_wrap():
    @timer
    def wrapped_function():
        return

    assert wrapped_function.__name__ == "wrapped_function"

现在您可以在终端中使用 poetry install 来安装并本地验证您的包。如果您还没有激活虚拟环境,请激活它,然后在 Python 交互式 shell 中:

>>> from how_long import timer
>>>
>>> @timer
... def test_function():
...     [i for i in range(10000)]
...
>>> test_function()
Execution Time: 705 ms.

运行测试,如果一切正常,请继续。

构建和发布

最后,让这个项目向全世界可用的时刻到来了!确保您在 PyPI 上有一个帐户。请记住,包名称必须是唯一的,如果不确定,请使用 搜索 进行检查。

构建

poetry build 命令构建源代码和 wheels 归档文件,这些文件稍后将作为项目的来源上传:

poetry build

将创建 how_long.egg-info 目录。

发布

此命令将包发布到 PyPI,如果这是首次提交,它会自动注册后再上传:

poetry publish

您也可以使用 $ poetry publish --build 来构建和发布您的项目。

输入您的凭据,如果一切正常,浏览 您的项目,您将看到类似以下的内容:

pipy how-long

我们现在可以告诉其他人他们可以从任何机器、任何地方使用 pip install how-long

结论

我记得我第一次尝试发布包时的情景,那简直是一场噩梦。我当时刚开始接触 Python,花了好“几个小时”才弄明白 setup.py 文件是什么以及如何使用它。最后,我得到了几个文件:一个 Makefile、一个 MANIFEST.in、一个 requirements.txt 和一个 test_requirements.txt。这就是为什么 Sébastien EustacePoetry 的创建者的话对我来说非常有意义:

Python 中的打包和依赖管理对于新手来说相当复杂且难以理解。即使对于经验丰富的开发人员来说,创建 Python 项目所需的所有文件有时也可能很麻烦:setup.pyrequirements.txtsetup.cfgMANIFEST.in 以及新添加的 Pipfile

所以我想要一个工具,将所有内容限制在一个配置文件中,以完成:依赖管理、打包和发布。

它借鉴了其他语言中已有的工具,例如 composer (PHP) 或 cargo (Rust)。

最后,没有可靠的工具可以正确解析 Python 中的依赖项,所以我创建了 poetry 来为 Python 社区带来一个详尽的依赖解析器。

Poetry 绝非完美,但与其它工具不同,它确实兑现了它的承诺。