使用pyproject.toml和Hatch时,可编辑安装无法读取数据文件夹怎么办?
问题根源
正常安装pip install .时,Hatchling会按照[tool.hatch.build.force-include]的配置,把src/data目录打包到安装后的mypackage/data路径下,代码能正常读取文件。但**可编辑安装pip install -e .**是直接在Python环境中创建包目录的符号链接,不会执行构建时的文件复制操作,此时src/mypackage目录下并没有data文件夹,导致Path(__file__).parent / 'data/fruits.csv'找不到目标文件。
解决方案
方案一:调整目录结构(最直观)
把src/data直接移动到src/mypackage目录下,让数据文件成为包的一部分:
mypackage ├── README.md ├── examples │ └── example.py ├── pyproject.toml ├── src │ └── mypackage │ ├── __init__.py │ ├── adder.py │ ├── fruit_reader.py │ └── data │ └── fruits.csv └── tests ├── test_adder.py └── test_read_fruits.py
同时修改pyproject.toml,删除[tool.hatch.build.force-include]配置块——因为包目录下的文件会被Hatchling自动包含进安装包,无需额外配置。
这种方式下,不管是正常安装还是可编辑安装,Path(__file__).parent / 'data/fruits.csv'都能正确定位到文件。
方案二:使用官方推荐的importlib.resources读取数据(兼容性最佳)
Python 3.9+提供了importlib.resources模块,专门用于读取包内数据文件,兼容所有安装模式(正常/可编辑)。修改fruit_reader.py的代码:
import pandas as pd from importlib.resources import files def read_fruits(): """ Read fruit data from CSV file. """ # 获取包内data/fruits.csv的路径 path = files('mypackage').joinpath('data/fruits.csv') print(f'File path is\n{path}') df = pd.read_csv(path) print(f'Pandas dataframe is\n{df}')
注意保留pyproject.toml中的[tool.hatch.build.force-include]配置,确保正常安装时src/data被打包到mypackage/data路径下。
方案三:手动创建符号链接(临时 workaround)
如果不想修改代码或目录结构,可以在可编辑安装后,手动给src/mypackage创建data目录的符号链接:
- Linux/macOS:
cd src/mypackage ln -s ../../data data - Windows(管理员权限):
cd src\mypackage mklink /D data ..\..\data
这种方式需要手动操作,适合临时测试场景,不推荐长期使用。
内容的提问来源于stack exchange,提问作者wigging

