在pyproject.toml中指定包数据

问题描述 投票:0回答:7

我用

setuptools
。在
setup.cfg
中,我可以定义

[options.package_data]
myModule =
    '*.csv'

确保为我的用户安装数据。

我可以用

pyproject.toml
来实现同样的效果吗?

python pip setuptools
7个回答
46
投票

从 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

阅读完整文档以获取更多选项。


9
投票

假设项目目录结构如下

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


6
投票

如果我理解您的担忧,您正在使用

setuptools
作为构建和分发系统,并且您希望将一些配置从
setup.[py,cfg]
package_data
移动到
pyproject.toml
,如果是这样,您必须使用其他工具来构建并分发您的软件包,例如
poetry
,如 @Romibuzi 的答案中所述,因为这是不可能的除非 setuptools 团队计划发布一个新的主要版本以包含对
pyproject.toml
的全面支持,然后不需要额外/独立的配置
setup.cfg
文件。

一些参考:

更新

根据 v61.0.0,setuptools 对此功能带来部分支持(仍处于测试版本)。

请参阅@LudvigH的答案。 (谢谢你顺便说一句)


5
投票

截至目前,如果您正在使用

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
只是为了向后兼容。你实际上并不需要它。


3
投票

除了其他现有答案之外,还可以简单地使用

MANIFEST.in
文件。

参见 https://packaging.python.org/en/latest/guides/using-manifest-in/


2
投票

如果您使用的是 Hatchling,根据 docs,您也可以通过以下方式执行此操作:

[tool.hatch.build]
include = [
  "myModule/**/*.csv",
  "**/*.py",  
]
exclude = [
  "tests/**",
]

0
投票

我喜欢的事情之一就是能够进行更改,然后在提交之前(!)仔细检查它。

对于这个问题,您可以做的一件事是打开 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.>

所以这样做:

  • 修改pyproject.toml以获得你想要的数据。
  • 请勿更改版本!
  • 运行您的流程来构建鸡蛋。我使用 do_publish_setup.py:
import setuptools

setuptools.setup()

运行它

python do_publish_setup.py -q sdist
  • 运行麻绳来检查它:
twine check dist/* 
  • 如果没有问题,那么应该已经创建了 Egg-info,您可以仔细检查 SOURCES.txt 文件中是否有您期望的所有内容。

将这个过程放入 setuptools 文档...某处会非常好。

© www.soinside.com 2019 - 2024. All rights reserved.