You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python包中正确包含复杂层级结构的数据目录(以NLTK数据目录为例)

解决方法:在Python包中包含多层结构的NLTK数据目录

你遇到的问题很常见——当需要分发带有复杂目录层级的资源文件时,单个文件的配置方式肯定满足不了需求。这里有两种可靠的方案,能帮你把整个nltk_data目录完整打包并保留原有结构:

方案1:使用package_data的递归通配符

从setuptools 36.2.0版本开始,支持**递归通配符,可以匹配指定目录下所有层级的文件和子目录。你只需要修改setup.py里的package_data配置:

from setuptools import setup, find_packages

setup(
    name='some-cool-name',
    version="1.0.0",
    classifiers=[],
    packages=find_packages(where='src'),
    package_dir={'': 'src'},
    # 用**递归匹配nltk_data下所有子目录与文件
    package_data={'my_pkg': ['resources/nltk_data/**/*']},
    include_package_data=True,
    py_modules=[],
    python_requires='>=3.8',
    install_requires=['nltk==3.6.5']
)

这里的resources/nltk_data/**/*会精准匹配:

  • resources/nltk_data目录下的所有直接文件
  • resources/nltk_data下所有子目录里的所有文件(无论层级多深)

方案2:使用MANIFEST.in文件(更直观可控)

如果你觉得通配符写法不够清晰,可以创建MANIFEST.in文件来明确指定要包含的资源。在项目根目录(和setup.py同级)创建该文件,内容如下:

# 包含my_pkg/resources/nltk_data下的所有内容(递归匹配)
include src/my_pkg/resources/nltk_data/**/*

然后保持setup.py里的include_package_data=True(这个参数会让setuptools自动读取MANIFEST.in的配置),package_data字段可以留空或者直接移除。

关键补充:在代码中正确访问打包后的资源

打包完成后,用户安装你的包时,nltk_data会被放在包的安装路径下,不能直接用本地开发时的相对路径访问。你需要用Python的资源访问工具获取正确路径,还要告诉NLTK优先使用我们打包的数据:

方法A:使用importlib.resources(Python 3.9+推荐)

# 在my_module.py中
import importlib.resources
import nltk

# 获取nltk_data的实际安装路径
with importlib.resources.path('my_pkg.resources', 'nltk_data') as data_path:
    # 把自定义数据路径插入到NLTK路径列表最前面,确保优先使用
    nltk.data.path.insert(0, str(data_path))

# 之后就可以正常使用NLTK功能,无需用户手动下载数据

方法B:使用pkg_resources(兼容旧版本Python)

# 在my_module.py中
import pkg_resources
import nltk

data_path = pkg_resources.resource_filename('my_pkg', 'resources/nltk_data')
nltk.data.path.insert(0, data_path)

这样配置后,用户安装你的包时,整个nltk_data目录会完整保留原有结构,你的代码也能自动定位到这些数据,完全不需要用户额外操作。

内容的提问来源于stack exchange,提问作者Honza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 17:42:37