Python 历时这么久以来至今还未有一个事实上标准的项目管理及构建工具,以至于造成 Python 项目的结构与构建方式五花八门。这或许是体现了 Python 的自由意志。

不像 Java 在经历了最初的手工构建,到半自动化的 Ant, 再到 Maven 基本就是事实上的标准了。其间 Maven 还接受了其他的 Gradle(Android 项目主推), SBT(主要是 Scala 项目), Ant+Ivy, Buildr 等的挑战,但都很难撼动 Maven 的江湖地位,而且其他的差不多遵循了 Maven 的目录布局
回到 Python,产生过 pip, pipenv, conda 那样的包管理工具,但对项目的目录布局没有任何约定
关于构建很多还是延续了传统的 Makefile 的方式,再就是加上 setup.py 和 build.py 用程序代码来进行安装与构建。关于项目目录布局,有做成项目模板的,然后做成工具来应用项目模板
下面大概浏览一下四个工具的使用
CookieCutter
PyScaffold
PyBuilder
Poetry
CookieCutter 一个经典的 Python 项目目录结构
最后由 cookiecutter 生成的项目模板是下面的样子:
这大概是当前比较流行的目录结构的主体框架,主要元素是:
项目 sample 目录中重复 sample 目录中放置 Python 源文件, 目录中是测试文件,再加一个 目录放文档,README.rst, 其他的用于构建的 setup, setup.cfg 和 Makefile 文件。
这其实是一个很经典的 Python 项目结构,接下来的构建就用 命令了,输入 会看到定义在 Makefile 文件中的指令
为使用上面的构建过程,需要安装相应的包,如 , , , , , 它们都可以通过 来安装。之后就可以 , , , 等。其中 可以生成一个很漂亮的 Web 文档。
PyScaffold 创建一个项目
PyScaffold 顾名思义,它是一个用来创建 Python 项目脚手架的工具,安装和使用:
这样创建了一个 Python 项目,目录结构与前面 cookiecutter 所选的模板差不多,只不过它把源文件放在了 目录,而非 目录。
整个项目的构建就要用 这个工具了。 是一个自动化测试和构建工具,它在构建过程中可创建 Python 虚拟环境,这让测试和构建能有一个干净的环境。
能显示出定义在 中所有的任务:
要执行哪个命令便用 , 等
在我体验 tox 命令过程中,每一步好像都比较慢,应该是创建虚拟机要花些时间。
PyBuilder
最好再看另一个构建工具 PyBuilder, 它所创建出的目录结构很接近于 Maven, 下面来瞧瞧
完后看下它的目录结构:
构建过程仍然是用 命令,可用 查看帮助, 列出所有的任务, PyBuilder 的任务是以插件的方式加入的,插件配置在 文件中。
PyBuilder 也是在构建或测试之前创建虚拟环境, 从 0.12.9 版开始可通过参数 跳过创建虚拟环境这一步。使用了 的话 Python 代码将会在运行 的当前 Python 环境中执行,所需的依赖将要手工安装。
项目的依赖也要定义在 文件中
随后在执行 创建虚拟环境时就会安装上面的依赖,并在其中运行测试与构建。
Poetry
最后一个 Poetry, 感觉这是一个更为成熟,项目活跃度也更高的 Python 构建,它有着更强大的信赖管理功能,用 就能添加依赖, 显示出依赖树。看下如何安装及创建一个项目
它创建的项目比上面都简单
如果给 带上 参数,那么源文件目录 会放在 目录下,即 .
会在当前目录中生成 文件,目录等的生成需手动完成。
它不关注文档的生成,代码规范的检查,代码覆盖率都没有。它的项目配置更集中,全部在 文件中, 是什么呢?它是一种配置文件的格式 Tom's Obvious, Minimal Language 。
有些类似 NodeJS 的 文件,比如 poetry add, poetry install 命令的行
其他主要的
能执行任何系统命令,只是它会在它要的虚拟环境中执行。所以可以想见, 的项目要生成文档或覆盖率都必须用 命令来支持 , 或 。
在 sample 目录(与 pyproject.toml 文件平级)中创建文件 , 内容为
然后在 中写上
再执行
就会输出 "hello poetry"。
如此通过对以上四个工具的认识,项目结构的复杂度由 cookiecutter-pyproject -> PyScaffold -> PyBuilder -> Poetry 依次降低,使用的难度大略也是相同的顺序!
以上就是本次分享的全部内容,想学习更多Python技巧,欢迎持续关注六星源课堂!
网友评论