如何不调整目录结构为Python hello包打包my_data数据?
解决单模块Python包数据文件安装问题
你的问题核心在于:使用py-modules声明单模块时,package-data配置仅适用于包目录(含__init__.py的文件夹),而你的hello是单个.py文件,并非包目录,因此无法匹配到my_data资源。以下是可行的解决方案:
方案1:修改pyproject.toml使用data-files配置
替换原[tool.setuptools.package-data]部分,改用data-files指定全局数据文件的安装路径:
[project] name = "hello" version = "0.1" [tool.setuptools] py-modules = ['hello'] # 将my_data目录及其内容安装到site-packages下的hello关联路径 [tool.setuptools.data-files] "hello" = ["my_data/**/*"]
- 这里的
"hello"是目标路径(相对于site-packages),会将my_data目录安装到site-packages/hello/下; - 如果希望直接将
my_data安装到site-packages根目录,可改为:[tool.setuptools.data-files] "my_data" = ["my_data/**/*"]
方案2:补充MANIFEST.in确保源码分发包含数据文件
如果通过源码包(sdist)安装,需要创建MANIFEST.in文件,让setuptools在生成源码包时纳入数据文件:
include my_data/**/*
这个文件会避免pip安装时因源码包缺失数据文件导致的安装失败。
验证安装效果
执行安装命令后,可通过以下命令确认数据文件是否存在:
# 查看hello包的安装路径 pip show hello | grep Location # 进入该路径查看my_data目录 ls $(pip show hello | grep -oP 'Location: \K.*')/hello/my_data
代码中读取数据文件的正确方式
安装完成后,在hello.py中可通过importlib.resources读取数据文件(以安装到site-packages/hello/my_data为例):
from importlib.resources import files def hello(): print('Hello, world!') # 获取数据文件路径 data_path = files("hello").joinpath("my_data", "my_data.csv") print(f"数据文件路径:{data_path}")
内容的提问来源于stack exchange,提问作者NicolasBourbaki
相关产品推荐
相关产品推荐

