如何正确地将数据文件夹包含到 python 包中

How to properly include data folder to python package

我正在构建一个小型 python 包,我将其部署到我们的内部 pypi 服务器,以便使用 pip 轻松安装。我正在使用 setup.py 构建 tar.gz 存档以上传到那里。 我需要包含一些额外的数据 - 更具体地说,我在我的项目中使用 nltk 并且我想发送包含已经下载的特定 nltk 数据的包,因为它没有意义我让使用我的包的人负责自己下载它。所以我有以下结构

├── setup.py
├── src
│   ├── __init__.py
│   ├── my_pkg
│   │   ├── __init__.py
│   │   ├── my_module.py
│   │   └── resources
│   │       └── nltk_data
|   |           └─... too many subfolders and files

我想在安装包后将整个 nltk_data 子文件夹包含在同一个位置。我设法为一个文件工作 package_data={'my_pkg' :['./resources/file.dat']},,但我不知道如何对具有许多子文件夹、子子文件夹、不同扩展名的文件等的复杂目录结构做同样的事情。有什么办法可以做到这一点吗?

我的setup.py很简单(为了简单起见,我省略了描述或URL等内容)

from setuptools import setup, find_packages

setup(
    name='some-cool-name',
    version="1.0.0",
    classifiers=[],
    
    packages=find_packages(where='src'),
    package_dir={'': 'src'},
    package_data={'my_pkg' :[]},
    include_package_data=True,
    py_modules=[],

    python_requires='>=3.8',
    install_requires=['nltk==3.6.5']
)

您可以简单地指定要包含的数据的相对路径。你需要在两个子文件夹中放置一个 __init__.py 文件,但它应该可以工作。

package_data={'my_pkg' :['my_pkg/resources/nltk_data/*']}

要在您的脚本中使用数据,请使用 importlib(例如 importlib.read_text)打开您想要的文件。

在我发布这个问题后不久,我遇到了另一种解决方案,这里没有提到,看起来很优雅,所以我把它放在这里,以防有人觉得它有用。 文件 MANIFEST.in 在目录结构的顶层,在 setup.py 旁边,可以很容易地用

做同样的事情
recursive-include src/my_pkg/resources *