如何将src目录外的config目录文件打包进Python Wheel
如何将src目录外的config目录文件打包进Python Wheel
嗨,我来帮你解决这个问题~你现在遇到的核心问题是:config 目录不在你的Python包(src/sophios)的范围内,所以用 package_data 指向 ../config/* 是无效的——因为package_data 只能指定包内部的文件路径,没法跨到包外的目录。
下面给你两种靠谱的解决方案,你可以根据自己的需求选:
方案一:用 data_files 参数直接指定外部文件
data_files 是setuptools专门用来打包包外资源的参数,它可以定义源文件路径和安装后的目标路径。
修改你的 setup.py 如下:
from setuptools import setup, find_packages import glob # 如果需要批量匹配文件的话 setup( name="sophios", version="0.1.0", packages=find_packages(where="src"), package_dir={"": "src"}, # 添加data_files配置 data_files=[ # 第一个元素是安装后文件存放的路径(相对于site-packages) # 第二个元素是要打包的源文件列表 ("sophios/config", glob.glob("config/*")), # 如果有子目录,可以继续添加,比如("sophios/config/sub", glob.glob("config/sub/*")) ], )
代码里怎么读取这些文件?
安装后,这些文件会被放到 site-packages/sophios/config 目录下,你可以用 pkg_resources 来获取它们的绝对路径:
import pkg_resources # 获取某个配置文件的路径 config_file_path = pkg_resources.resource_filename("sophios", "config/your_config.ini")
方案二:把 config 变成一个独立的Python包
如果你希望config作为一个可导入的模块存在,可以给config目录添加一个空的__init__.py,然后修改setup.py把它纳入打包范围:
- 先在
config/目录下创建__init__.py(空文件就行) - 修改
setup.py:
from setuptools import setup, find_packages setup( name="sophios", version="0.1.0", # 把config也加入包列表 packages=find_packages(where="src") + ["config"], # 指定config包的路径在项目根目录 package_dir={"": "src", "config": "../config"}, include_package_data=True, # 给config包指定要包含的文件 package_data={ "config": ["*"], # 如果有子目录,写成"config/sub/*" }, )
你的MANIFEST.in保持include config/*不变就可以了。
代码里怎么读取这些文件?
这种方式下,你可以直接导入config包,然后用importlib.resources来读取文件:
from importlib.resources import files config_file = files("config").joinpath("your_config.ini") with open(config_file, "r") as f: content = f.read()
额外提醒
- 测试打包效果的话,可以用
python setup.py bdist_wheel生成wheel,然后用unzip -l your_package-0.1.0-py3-none-any.whl查看里面的文件结构,确认config文件是否被包含。 - 如果用
data_files,要注意跨平台的路径兼容性,尽量用相对路径,避免硬编码绝对路径。
备注:内容来源于stack exchange,提问作者Samee
相关产品推荐
相关产品推荐

