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

Python打包时无法将resources目录文件纳入包中求助

Python CLI打包:资源文件未包含及whl/tar包问题解决

一、资源文件未被打包到site-packages的解决方法

首先确认项目结构符合Python包规范,示例结构如下:

my_aws_cli/
├── my_aws_cli/
│   ├── __init__.py
│   ├── cli.py          # CLI入口脚本
│   └── resources/
│       ├── __init__.py  # 必须添加空文件,让resources成为子包
│       └── config.json  # 要上传的资源文件
└── pyproject.toml

接下来在pyproject.toml中配置资源打包规则,两种可选方式:

方式1:用package-data直接配置(推荐)

在pyproject.toml中添加以下内容,指定主包名和对应资源路径:

[tool.setuptools]
packages = ["my_aws_cli"]

[tool.setuptools.package-data]
"my_aws_cli" = ["resources/*"]

这里的"my_aws_cli"是你的主包名,"resources/*"表示包含该目录下所有文件。

方式2:用include-package-data配合MANIFEST.in

  1. 在项目根目录创建MANIFEST.in文件,写入:
recursive-include my_aws_cli/resources *
  1. 在pyproject.toml中开启自动包含资源:
[tool.setuptools]
include-package-data = true
packages = ["my_aws_cli"]

配置完成后,重新执行python -m build打包,再安装生成的包,资源文件就会被同步到site-packages对应的包目录下。

正确读取资源文件的代码

使用importlib_resources时,要基于包路径定位:

from importlib_resources import files

# 获取resources目录下的config.json路径
resource_file = files("my_aws_cli.resources").joinpath("config.json")

# 读取文件内容
with open(resource_file, "r") as f:
    content = f.read()

二、关于whl和tar包的疑问

  • 不需要同时安装两种包。whl是预编译二进制包,安装速度快,是pip优先选择的分发格式;tar.gz(源码包,sdist)是源码归档,仅在没有对应平台的whl包,或者用户需要修改源码时才会用到。
  • 打包时可以用python -m build同时生成whl和sdist两种格式,方便分发给不同需求的用户,但客户端安装时只需要其中一种即可。

内容的提问来源于stack exchange,提问作者Cesar Javaroni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:27:27