You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
python这种依赖管理行为不像一些现代的依赖管理工具链,如 golang 的 go mod 和 rust 中的 cargo。例如:golang 中每次通过 go get 安装依赖包,都会更新和维护 go.mod 和 go.sum,也可以通过 go mod tidy 来整理包。pip 不会这样维护 requirements.txt。
项目Layout
虽然没有标准的官方推荐,社区还是有一些最佳实践可以参考。1
例如,一个包含多个子模块的Python项目,推荐的项目结构如下:
setup.py
基于 setuptools 或 distutils 库编写的脚本,包含了项目的元数据、依赖关系以及其他配置信息。具体作用包括:
install_requires
列表中指定的项目运行所需的第三方库及其版本,这样在安装该包时,相关依赖也会自动安装entry_points
参数可以创建命令行脚本,使得用户在安装包后可以直接通过命令行调用特定功能packages
或py_modules
参数指定需要打包的模块和包;还可以使用package_data
或include_package_data
包含非 Python 文件,如配置文件、静态资源等python setup.py sdist
可以生成源码分发包;运行python setup.py bdist_wheel
可以生成二进制分发包(wheel格式:todo: 什么是wheel格式?)。通过twine
等工具将构建好的包上传到 PyPI 等包管理平台,方便他人安装使用。例如,如下是 vllm 的
setup.py
中的 setup 命令的内容(当然还有一些辅助内容,这里不列出):不过:随着 Python 包管理工具的发展,例如 poetry 和 flit,以及 PEP 517/518 标准的引入,setup.py 的使用逐渐被 pyproject.toml 等配置文件所补充或替代。但在很多现有项目和传统流程中,setup.py 仍然是核心的构建和分发脚本。
pyproject.toml
相比于传统的 setup.py,pyproject.toml 更加标准,提升了可读性和可维护性,增强了与现代工具链的兼容性和集成能力,正逐步取代 setup.py 成为项目配置的标准方式。
例子:
项目技术选型
数据库ORM
sqlalchemy 是一个比较常见的选择,相对于其他ORM:
还有与之配套的数据库迁移工具(alembic)。
alembic的基本用法
todo
数据验证与序列化
Pydantic 是一个用于数据验证和设置管理的 Python 库,利用 Python 的类型提示(type annotations)提供强大的数据解析、验证和转换功能。它主要通过定义数据模型(通常是继承自 BaseModel的类)来确保输入数据符合预期的结构和类型,从而解决如下问题:
在Golang的项目中,我们可以类比 Struct + 类型注解的组合,在gin中可以以同样的逻辑进行输入参数的检查。
重试机制
重试机制是一个更加细节的能力,但却是横向能力,我们请求外部系统可能会失败,但大多数的失败是偶发的,可以通过重试来避免这种偶发失败对复杂工作流程的影响。tenacity 是python 生态中一个常用的重试库,当然我们也可以自行编写简单的重试逻辑。
tenacity 使用
todo
依赖管理
现代python 开发中,一般都是为项目启动一个单独的 virtual env,这个evev 有自己的隔离的 python环境和独立的包管理,不会影响其他的应用。在这种模式下,项目的依赖常用 requirements.txt 作为配置。生成这个文件可以有多种方法:
实际使用中,pipreqs 生成的依赖总是有一些问题,使用 pip freeze 生成的依赖配置可以顺利安装:
pip install -r requirements.txt
。python这种依赖管理行为不像一些现代的依赖管理工具链,如 golang 的
go mod
和 rust 中的 cargo。例如:golang 中每次通过go get
安装依赖包,都会更新和维护 go.mod 和 go.sum,也可以通过 go mod tidy 来整理包。pip 不会这样维护 requirements.txt。一些新的依赖管理工具如 poetry,会像 golang 中一样维护依赖文件(pyproject.toml 和 poetry.lock 文件),当然poetry 也可以兼容传统的 requirements.txt,所以也可以兼容 CICD 环境不支持 pyproject.toml 的情况。所以,为什么不用 poetry呢?
使用 poetry
poetry 是命令行,推荐使用 pipx 安装。就像 nodejs 中的 npm 和 npx 两个命令,npx 是管理命令行的依赖安装。2
如果你是现有项目,在项目根目录执行
poetry init
,就会得到 pyproject.toml 配置文件,接下来就通过poetry add xxx
安装依赖就行,在 pyproject.toml 中的 dependencies 部分就会有依赖和版本限制说明,同时还会写入 poetry.lock 来锁定安装的依赖版本。3单元测试
pytest 是 python生态中常用的单元测试工具,它有几项很有用的能力:参数化测试(table)、Fixtures、测试标记、捕获日志输出、测试插件。
这种测试也叫 table test,例如:
pytest 提供了 Fixture 功能,适合用于设置和清理测试环境。例如,测试数据库操作,需要预先准备数据库连接,初始化数据。例子如下:
todo
todo
todo
参考
Footnotes
https://stackoverflow.com/questions/193161/what-is-the-best-project-structure-for-a-python-application ↩
https://python-poetry.org/docs/#installation ↩
https://python-poetry.org/docs/basic-usage/ ↩
The text was updated successfully, but these errors were encountered: