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

Hon*_*nza 1 python pip

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

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 setup.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_pkg\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_module.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 resources\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 nltk_data\n|   |           \xe2\x94\x94\xe2\x94\x80... too many subfolders and files\n\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
from setuptools import setup, find_packages\n\nsetup(\n    name='some-cool-name',\n    version="1.0.0",\n    classifiers=[],\n    \n    packages=find_packages(where='src'),\n    package_dir={'': 'src'},\n    package_data={'my_pkg' :[]},\n    include_package_data=True,\n    py_modules=[],\n\n    python_requires='>=3.8',\n    install_requires=['nltk==3.6.5']\n)\n\n
Run Code Online (Sandbox Code Playgroud)\n

小智 5

您只需指定要包含的数据的相对路径即可。不过,您需要__init__.py在两个子文件夹中放置一个 -file,但它应该可以工作。

package_data={'my_pkg' :['my_pkg/resources/nltk_data/*']}
Run Code Online (Sandbox Code Playgroud)

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