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
- 在项目根目录创建
MANIFEST.in文件,写入:
recursive-include my_aws_cli/resources *
- 在
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
相关产品推荐
相关产品推荐

