python - 在Python包目录之外添加数据目录

标签 python setuptools setup.py python-packaging python-importlib

给定包 my_package 的以下目录结构:

/
├── data/
│   ├── more_data/
│   └── foo.txt
├── my_package/
│   ├── __init__.py
│   └── stuff/
│       └── __init__.py
├── README.md
├── setup.cfg
├── setup.py

如何在不使用 __file__ 或其他 hacky 解决方案的情况下,从代码中访问 data/ 目录(以最 Pythonic 的方式)?我尝试在 setup.py 中使用 data_filessetup.cfg 中的 [options.package_data] ,但没有有效。

我想做这样的事情:

dir_data = importlib.resources.files(data)
csv_files = dir_data.glob('*.csv')

编辑:

我正在使用可编辑的安装,并且包中已有一个 data/ 目录(用于与顶级数据无关的源代码)。

最佳答案

我能想到两种解决方案。对于这两种解决方案,目标都是将数据移动到顶级可导入包中(这就是为什么它被称为“包数据”)。这意味着可以通过如下方式访问数据:

importlib.resource.files('mypackage.data')

1.在源代码存储库中移动文件

一个简单直接的解决方案是将 data/ 目录移动到 my_package/data/。然后照常进行包装。


2.setuptools在构建时“移动”数据

package_dir setuptools 的功能,可以在构建时修改目录结构。

请注意,此方法不适用于“可编辑安装”。

它在 setup.cfg 中可能看起来像这样(未经测试):

[options]
# ...
package_dir=
    my_package=my_package
    my_package.data=data

关于python - 在Python包目录之外添加数据目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75403882/

相关文章:

python - 根据另一个库版本安装特定的 python 库版本

python - 如何防止列表在用作函数参数后发生变化?

python - 使用 setup.py (setuptools) 制作的 rpm 的安装目录

python - 为什么我的包不能安装 "pipx"?

python - setuptools build_ext 的行为与 distutils 不同吗?

python - 为什么我需要在 setup.py 中包含子包

python - setup.py 的 sdist、bdist 和 install 在 data_files 方面表现不同

python - 从键盘解析函数并执行它

python - 禁用 argparse 选择消息

python - gevent urllib 很慢