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

如何将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把它纳入打包范围:

  1. 先在config/目录下创建__init__.py(空文件就行)
  2. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 06:57:58