关于 pyproject.toml 与 setup.py 的问题
Questions on pyproject.toml vs setup.py
正在阅读 pyproject.toml、python -m pip install、poetry、flit 等 - 我有几个关于将 setup.py 替换为 pyproject.toml 的问题。
我最大的问题是 - toml 文件如何替换 setup.py。意思是,一个 toml 文件不能做一个 py 文件可以做的所有事情。读进去,诗和flit把setup.py完全换成了pyproject.toml。虽然 pip 使用 pyproject.toml 来指定构建工具,但仍然使用 setup.py 来指定其他所有内容。
一个很好的例子是,pip 目前无法直接在 toml 文件中为控制台脚本做入口点,但 poetry 和 flit 可以。
- https://flit.readthedocs.io/en/latest/pyproject_toml.html#scripts-section
- https://python-poetry.org/docs/pyproject/#scripts
我现在的主要问题是;
pyproject.toml 的重点是提供构建系统要求。它是一个元数据文件。因此,理想的解决方案是仅使用此文件来指定构建系统要求并仍然利用 setup.py 来处理其他所有内容。
我很困惑,因为我觉得我们为了解决一个相当简单的问题而损失了很多。通过完全使用 setup.py 并将其替换为 pyproject.toml,我们失去了很多我们可以在 setup.py 中做的有用的事情。我们不能使用 __version.py__
,我们失去了自动创建万向轮和 sdist 以及使用 Twine 将我们的包上传到 PyPi 的能力。我们目前可以在 setup.py 文件中执行此操作。
我只是有时间思考为什么我们要用仅元数据的文件完全替换 setup.py。似乎将它们一起使用是两全其美的方法。我们解决了先有鸡还是先有蛋的构建系统问题,并保留了 setup.py 可以做的很多有用的事情。
我们不需要 setup.py 来以开发模式安装吗?或者这可能只是一个 pip 问题?
这更像是评论而不是答案,但由于我缺少声誉,我不得不将其作为答案。
目前我也在研究这个功能。我发现了这个 experimental feature setuptools 的解释,它应该只引用 pyproject.toml
,最后不需要 setup.py
。
关于 setup.py
的 dynamic
行为,我发现您可以为 [project]
元数据
下的字段设置动态行为
dynamic = ["version"]
[tool.setuptools.dynamic]
version = {attr = "my_package.__version__"}
最后,我猜 setuptools 会覆盖缺失的 setup.py
执行并放置必要的 egg-links 开发模式。
我也非常感谢关于该主题的任何更多意见。
Pip 不使用 setup.py 做其他事情。
Setuptools 本身不鼓励使用 setup.py 并过渡到 setup.cfg(或 pyproject.toml)。
许可证、摘要、名称、author-email、版本...都可以在没有 setup.py 的情况下使用 pip,并且 pip 也创建了一个轮子。
亲眼看看 pip 可以对 pyproject.toml
文件做什么:
https://pip.pypa.io/en/stable/reference/build-system/pyproject-toml/
您可以使用 entry-points
键指定入口点,如 @casabre 在 link 处所示:
https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html
Toml 不仅仅是一个简单的 requirements.txt
。您可以设置复杂的指令,例如:
tool.setuptools.packages = {find = {where = ["src"], exclude=["tests*"]}}
并且 __version__.py
成为您的 pyproject.toml
文件中的一个简单条目,甚至像@casabre 所说的那样是动态的:
[project]
version = "0.1.0"
使用 twine 上传到 PyPi 也应该按照这个 link 工作:
https://setuptools.pypa.io/en/latest/userguide/quickstart.html#uploading-your-package-to-pypi
要在开发模式下安装,您可以在 pyproject.toml
:
中配置类似这样的内容
[project.optional-dependencies]
dev = ["flake8", "pytest"]
然后 pip install .[dev]
在您的项目文件夹中。
正在阅读 pyproject.toml、python -m pip install、poetry、flit 等 - 我有几个关于将 setup.py 替换为 pyproject.toml 的问题。
我最大的问题是 - toml 文件如何替换 setup.py。意思是,一个 toml 文件不能做一个 py 文件可以做的所有事情。读进去,诗和flit把setup.py完全换成了pyproject.toml。虽然 pip 使用 pyproject.toml 来指定构建工具,但仍然使用 setup.py 来指定其他所有内容。
一个很好的例子是,pip 目前无法直接在 toml 文件中为控制台脚本做入口点,但 poetry 和 flit 可以。
- https://flit.readthedocs.io/en/latest/pyproject_toml.html#scripts-section
- https://python-poetry.org/docs/pyproject/#scripts
我现在的主要问题是;
pyproject.toml 的重点是提供构建系统要求。它是一个元数据文件。因此,理想的解决方案是仅使用此文件来指定构建系统要求并仍然利用 setup.py 来处理其他所有内容。
我很困惑,因为我觉得我们为了解决一个相当简单的问题而损失了很多。通过完全使用 setup.py 并将其替换为 pyproject.toml,我们失去了很多我们可以在 setup.py 中做的有用的事情。我们不能使用 __version.py__
,我们失去了自动创建万向轮和 sdist 以及使用 Twine 将我们的包上传到 PyPi 的能力。我们目前可以在 setup.py 文件中执行此操作。
我只是有时间思考为什么我们要用仅元数据的文件完全替换 setup.py。似乎将它们一起使用是两全其美的方法。我们解决了先有鸡还是先有蛋的构建系统问题,并保留了 setup.py 可以做的很多有用的事情。
我们不需要 setup.py 来以开发模式安装吗?或者这可能只是一个 pip 问题?
这更像是评论而不是答案,但由于我缺少声誉,我不得不将其作为答案。
目前我也在研究这个功能。我发现了这个 experimental feature setuptools 的解释,它应该只引用 pyproject.toml
,最后不需要 setup.py
。
关于 setup.py
的 dynamic
行为,我发现您可以为 [project]
元数据
dynamic = ["version"]
[tool.setuptools.dynamic]
version = {attr = "my_package.__version__"}
最后,我猜 setuptools 会覆盖缺失的 setup.py
执行并放置必要的 egg-links 开发模式。
我也非常感谢关于该主题的任何更多意见。
Pip 不使用 setup.py 做其他事情。
Setuptools 本身不鼓励使用 setup.py 并过渡到 setup.cfg(或 pyproject.toml)。
许可证、摘要、名称、author-email、版本...都可以在没有 setup.py 的情况下使用 pip,并且 pip 也创建了一个轮子。
亲眼看看 pip 可以对 pyproject.toml
文件做什么:
https://pip.pypa.io/en/stable/reference/build-system/pyproject-toml/
您可以使用 entry-points
键指定入口点,如 @casabre 在 link 处所示:
https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html
Toml 不仅仅是一个简单的 requirements.txt
。您可以设置复杂的指令,例如:
tool.setuptools.packages = {find = {where = ["src"], exclude=["tests*"]}}
并且 __version__.py
成为您的 pyproject.toml
文件中的一个简单条目,甚至像@casabre 所说的那样是动态的:
[project]
version = "0.1.0"
使用 twine 上传到 PyPi 也应该按照这个 link 工作: https://setuptools.pypa.io/en/latest/userguide/quickstart.html#uploading-your-package-to-pypi
要在开发模式下安装,您可以在 pyproject.toml
:
[project.optional-dependencies]
dev = ["flake8", "pytest"]
然后 pip install .[dev]
在您的项目文件夹中。