上传Python包到PyPI时data文件夹未被包含该如何解决?
问题原因
默认执行python3 setup.py sdist打包时,仅会自动包含Python包目录下的.py文件,以及根目录的README、LICENSE等默认识别的文件,你放在根目录的data文件夹未在打包配置中声明,因此不会被纳入sdist压缩包,安装后自然找不到对应目录。
修复方案
你可以任选以下两种方案之一配置:
方案1:使用MANIFEST.in声明额外包含文件(适配你当前的目录结构,无需调整文件位置)
- 在项目根目录(和
setup.py同级位置)新建名为MANIFEST.in的文件 - 在文件中添加规则声明要包含data目录的内容:
# 包含data目录下所有json文件 include data/*.json # 如果需要包含data目录下所有层级的所有文件,使用下方规则即可 # recursive-include data * - 修改
setup.py,在setup参数中添加include_package_data=True,示例配置如下:from setuptools import setup, find_packages setup( name="AAA", version="你的版本号", packages=find_packages(), include_package_data=True, # 必须添加该参数,才会读取MANIFEST.in的配置规则 # 其余你原有配置(作者、描述、依赖等)保持不变 )
方案2:将data目录移入包内,使用package_data配置
如果你希望data文件随Python包一起安装到site-packages的包目录下,可以选择该方案:
- 将根目录的
data文件夹移动到内层AAA/包目录下,调整后结构如下:AAA ├── AAA │ ├── data │ │ ├── table2.json │ │ └── table2.json │ ├── AAA.py │ ├── BBB.py │ ├── CCC.py │ ├── __init__.py │ └── DDD.py ├── LICENSE.txt ├── README.md └── setup.py - 在
setup.py中添加package_data参数配置即可,无需新建MANIFEST.in:setup( # 其余你原有配置保持不变 package_data={ # 键为包名,值为要包含的文件路径规则 "AAA": ["data/*.json"] } )
补充注意
安装后读取data文件时,不要使用硬编码的相对路径,建议使用importlib.resources模块读取包内文件,避免不同环境下路径不一致的问题,示例代码:
from importlib.resources import files import json # 方案2的读取示例 data_text = files("AAA.data").joinpath("table2.json").read_text() table_data = json.loads(data_text)
内容的提问来源于stack exchange,提问作者Asdoost
相关产品推荐
相关产品推荐

