怎么用 python 写「诗」:使用 poetry 打包和提交 package
在引入基于 pyproject.toml
的构建之前,pip 只支持使用安装包 setup.py
文件利用 setuptools 进行构建
setup.py (legacy) - pip documentation v22.2.2
Packaging Python Projects - Python Packaging User Guide 最开始按照这个教程来打包和发布,但是遇到了 build 失败,依赖无法解析的问题。
现在新版的 PEP 开始推荐利用 prproject.toml
把包括 setup.py
, setyp.cfg
, requirements.txt
等文件信息全部融合在一起了 (理论上简单了一些)
不过即使用 pyproject.toml
, 直接使用 python -m build
还是遭遇了建立虚拟环境 venv
过程中没法安装 pymatgen
的问题. 这一方面有一个原因是 pymatgen
的依赖确实太多了.
最后选择使用 poetry
来实现完整的构建和发布的过程. 包发布在了 pyw90
https://github.com/python-poetry/poetry
关于 poetry
的介绍
非常详细的对于 poetry
的介绍见 Python依赖管理及打包利器-Poetry - 掘金, 基本把官网文档内容都涵盖到了. 另一个同样非常详细的关于 poetry
的介绍, 见 相比 Pipenv,Poetry 是一个更好的选择 - 知乎
在写好整个 package 的 pyproject.toml
以后, 文件夹的目录应该如下所示
foo
├── pyproject.toml
├── README.rst
├── foo
│ └── __init__.py
└── tests
├── __init__.py
└── test_foo.py
pyproject.toml
文件到底该怎么写
官方文档已经把所有条目都列清楚了,可以对照着一条一条查看
https://python-poetry.org/docs/pyproject/
Poetry 里对版本号的要求写法还挺不一样的,具体见 Dependency specification | Documentation | Poetry - Python dependency management and packaging made
零散内容记录
使用 poetry
以后该怎么写 setup.py
因为使用 poetry 以后, 理论上所有的信息都在 pyproject.toml 文件里了, 也就没有平常可以使用的直接本地安装的 setup.py 文件. 如果单独把信息复制一份, 显然不好管理, 也不甚合适. 在 StackOverflow 看到如下的一个解决方案, 还是十分 nice 的.
#!/usr/bin/env python
import setuptools
if __name__ == "__main__":
setuptools.setup()
https://stackoverflow.com/questions/62983756/what-is-pyproject-toml-file-for
提升 poetry
依赖下载速度: 替换镜像源
https://greyli.com/set-pypi-mirror/
在 pyproject.toml
中添加
[[tool.flit.source]]
name = "aliyun-mirror"
url = "https://mirrors.aliyun.com/pypi/simple/"
使用 miniconda
+ poetry
在两者一起使用的时候,可能会遇到虚拟环境到底由哪个管理器来管理的问题。这里推荐还是使用 conda,最要命的一点因为 conda 可以在环境中指定不同的 python 版本。这就需要去把 poetry 的创建虚拟环境关掉
poetry config virtualenvs.create false
配置 pypi 账号和密码登陆
Poetry 的配置存储在单独的文件中,比 Pipenv 设置环境变量的方式要方便一点。配置通过 poetry config 命令设置,比如下面的命令可以写入 PyPI 的账号密码信息:
$ poetry config http-basic.pypi username password
一开始构建的小 bug:不能使用相对路径 import
https://github.com/python-poetry/poetry/issues/1580
Use relative import
from .config import Config
or better absolute importfrom testmodule.config import Config