我用
setuptools
。在setup.cfg
中,我可以定义
[options.package_data]
myModule =
'*.csv'
确保为我的用户安装数据。
我可以用
pyproject.toml
来实现同样的效果吗?
从 setuptools 版本 61.0.0 开始,提供了对此功能的测试版支持。请参阅文档 https://setuptools.pypa.io/en/stable/userguide/datafiles.html
语法是
[tool.setuptools.package-data]
myModule = ["*.csv"]
2024-01-12 更新: 这不再是测试版。有几种不同的机制可以实现数据包含。一种机制是请求基于 git 的自动发现。设置 setuptools 版本并启用
-scm
插件就足够了。现在 git 跟踪的所有文件都将被视为数据文件。相关部分是...
[build-system]
requires = [
"setuptools>=60",
"setuptools-scm>=8.0"]
我制作了一个完整的示例并发布在 github 上。 https://github.com/el-hult/mypkg
阅读完整文档以获取更多选项。
假设项目目录结构如下
project_root_directory
├── pyproject.toml
└── src
└── mypkg
├── __init__.py
├── data1.rst
├── data2.rst
├── data1.txt
└── data2.txt
只需将以下内容添加到您的 pyproject.toml
[tool.setuptools.packages.find]
where = ["src"]
[tool.setuptools.package-data]
mypkg = ["*.txt", "*.rst"]
更多信息可以在文档中找到@ https://setuptools.pypa.io/en/latest/userguide/datafiles.html
如果我理解您的担忧,您正在使用
setuptools
作为构建和分发系统,并且您希望将一些配置从 setup.[py,cfg]
即 package_data
移动到 pyproject.toml
,如果是这样,您必须使用其他工具来构建并分发您的软件包,例如 poetry
,如 @Romibuzi 的答案中所述,因为这是不可能的除非 setuptools 团队计划发布一个新的主要版本以包含对 pyproject.toml
的全面支持,然后不需要额外/独立的配置 setup.cfg
文件。
一些参考:
根据 v61.0.0,setuptools 对此功能带来部分支持(仍处于测试版本)。
请参阅@LudvigH的答案。 (谢谢你顺便说一句)
截至目前,如果您正在使用
pyproject.toml
和 setuptool
,则无需执行任何操作。只需在与 Python 代码相同的目录中添加一些额外的文件即可。
但请注意,只有在将它们签入源代码管理并且您正在使用
setuptools-scm
(该示例告诉您,所以您可能是这样)时,它才会添加它们。
例如这是我的
pyproject.toml
[build-system]
requires = ["setuptools", "setuptools-scm"]
build-backend = "setuptools.build_meta"
[project]
name = "foo"
authors = [
{name = "...", email = "..."},
]
description = "..."
readme = "README.md"
requires-python = ">=3.9"
dependencies = [
"pydantic",
"jinja2"
]
version = "1.0.1"
[project.scripts]
foo = "foo:main"
我有这些文件:
.
├── pyproject.toml
├── pyrightconfig.json
├── README.md
├── setup.py
└── src
└── foo
├── command.py
├── index.html
├── __init__.py
├── render.py
└── triage.py
当我运行
python3 -m build
时,它确实会将 index.html
添加到轮子上。
另外
setup.py
只是为了向后兼容。你实际上并不需要它。
除了其他现有答案之外,还可以简单地使用
MANIFEST.in
文件。
参见 https://packaging.python.org/en/latest/guides/using-manifest-in/
如果您使用的是 Hatchling,根据 docs,您也可以通过以下方式执行此操作:
[tool.hatch.build]
include = [
"myModule/**/*.csv",
"**/*.py",
]
exclude = [
"tests/**",
]
我喜欢的事情之一就是能够进行更改,然后在提交之前(!)仔细检查它。
对于这个问题,您可以做的一件事是打开 src/mymod.egg-info 目录。其中有一个 SOURCES.txt 文件,您的数据文件应该显示在该文件中:
LICENSE.txt
MANIFEST.in
README.md
pyproject.toml
setup.cfg
src/mymod/__init__.py
src/mymod/some_cool_script1.py
src/mymod/some_data.json <=== a data file!
src/mymod/some_script2.py
<etc.>
所以这样做:
import setuptools
setuptools.setup()
运行它
python do_publish_setup.py -q sdist
twine check dist/*
将这个过程放入 setuptools 文档...某处会非常好。