poetry 是什么
poetry 是一个虚拟环境和包管理的工具,并且还支持打包和发布。
可以用来管理python库和python程序。
功能介绍
安装
pip install poetry
安装后检查版本
poetry --version
初始化项目
- 在已有项目中
poetry init
- 新建一个项目
poetry new new_project
poetry new --src new_project # 将源码放在src目录下
初始项目结构如下:
.
├── poetry.lock
├── pyproject.toml
├── README.rst
├── rick_portal_gun
│ └── __init__.py
└── tests
├── __init__.py
└── test_rick_portal_gun.py
README.rst
建议改成.md
pyproject.toml
此文件管理依赖列表和项目的各种 meta 信息,用来替代 Pipfile、requirements.txt、setup.py、setup.cfg、MANIFEST.in 等等各种配置文件。
pyproject.toml
文件
[tool.poetry]
name = "elin-portal-gun" # Require 软件名称
version = "0.1.0" # Require 软件版本
description = "" # Require 描述
authors = ["Elin <365433079@qq.com>"] # Require 作者
readme = "README.md" # README.rst 或者 README.md
license = "GPL-3.0-or-later"
maintainers = [""] # 维护者
homepage = "" # 项目URL地址
repository = "" # 项目仓库URL地址
documentation = "" # 项目文档URL地址
keywords = [""] # 项目标签(max:5)
classifiers = = [
"Topic :: Software Development :: Build Tools",
"Topic :: Software Development :: Libraries :: Python Modules"
] # 项目的分类 https://pypi.org/classifiers/
packages = [
{ include = "my_package", from = "src"}, # 如果包在src/my_package,需要指定from
{ include = "extra_package/**/*.py" },
] # 包含的包,在标准情况下可以不需要,https://python-poetry.org/docs/pyproject/#packages
include = [""] # 包含的文件
exclude = [""] # 排除的文件
[tool.poetry.scripts] # 安装后脚本启动程序。
elin-portal-gun = "elin_portal_gun.main:app" #脚本elin-portal-gun执行时会去找elin_portal_gun包中的main文件执行app()
[tool.poetry.dependencies] # 依赖包
python = "^3.8"
typer = {extras = ["all"], version = "^0.4.0"}
[tool.poetry.dev-dependencies] # 开发依赖包
pytest = "^5.2"
[tool.poetry.extras] # 可选依赖,增强包等
mysql = ["mysqlclient"]
pgsql = ["psycopg2"]
[tool.poetry.urls] # 任何URL,当发布时会放在 Project Links 下面
"Bug Tracker" = "https://..."
[build-system] # 构建Python项目的标准方法
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
包依赖关系描述
config
查看config配置
poetry config --list
设置项:
cache-dir
缓存路径virtualenvs.create
bool 是否自动创建虚拟环境virtualenvs.in-project
bool/None
None:poetry 会在系统特定目录创建一个.venv目录,由下面的 path 参数指定
true: poetry 会在项目根目录创建一个.venv目录,我推荐这种方式,在项目根目录创建虚拟环境,这样就算移动目录位置也不影响虚拟环境的使用
false: poetry 将会忽略已存在的.venv目录
virtualenvs.path
虚拟环境路径
激活虚拟环境
poetry shell
- 查看虚拟环境信息
poetry env info
- 查看虚拟环境列表以及详细路径
poetry env list --full-path
- 删除虚拟环境
poetry env remove python
执行脚本
poetry run python app.py
除了以上的使用还可以自定义脚本
[tool.poetry.scripts]
test = "python test.py"
serve = "python run.py"
可以执行poetry run serve
安装包
poetry add typer[all]
poetry add pytest --dev # 开发依赖
追踪 & 更新包
poetry show
poetry show --tree # 查看依赖关系
poetry show --outdated # 查看可以更新的依赖
poetry update # 更新所有锁定版本的依赖
poetry update dep_name # 更新某个指定的依赖
poetry remove dep_name # 卸载包
切换python版本
poetry env use python3.8
安装项目
根据pyproject.toml
安装项目
poetry install
poetry install --no-dev # 不安装开发依赖
poetry install --no-root # 不安装项目本身
构建
poetry build
发布
poetry publish
poetry publish --build # 发布前先构建
要发布到pipy,可以先获取Token
token 就像下面这样:
pypi-wubalubadubdub-deadbeef1234
然后写入到poetry
poetry config pypi-token.pypi pypi-wubalubadubdub-deadbeef1234
然后就可以直接发布了
其他
要想在开发的时候安装其他项目的包该怎么办
我遇到了一个情况,当我同时开发两个包并且有依赖关系的时候,poetry并不能安装另外路径的包
假设packageA
依赖packageB
在packageB
中的虚拟环境安装完后,这时候查看虚拟环境中的Lib/site-packages
其实可以看到包含了两样东西:
<packageB>.dist-info
<packageB>.pth
将这两个文件复制到packageA
中的虚拟环境路径下的Lib/site-packages
中就可以了。
<packageB.pth>
里面就是包文件的路径,直接自己写也可以。
例如:
D:/CodeLibrary/git_project/ntc-templates
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 365433079@qq.com