使用Poetry发布的PyPI包安装后缺失资源文件问题
问题描述
项目结构:
| my-projectttttttt │ ├───dist │ my_projectttttttt-1.0.0-py3-none-any.whl │ my_projectttttttt-1.0.0.tar.gz │ ├───src │ ├───my_projectttttttt │ │ __init__.py │ │ __main__.py │ │ │ └───resources │ my_projectttttttt.png │ ├───tests │ test_my_project.py | │ LICENSE.md │ pyproject.toml │ README.md
当前pyproject.toml配置:
[build-system] requires = ["poetry-core>=1.0.0", "poetry-dynamic-versioning"] build-backend = "poetry.core.masonry.api" [tool.poetry] name = "my-projectttttttt" version = "1.0.0" description = "The description of the package" license = "MIT" authors = ["George K. Wright"] repository = "https://github.com/" homepage = "https://github.com/" packages = [ { include = "my_projectttttttt", from = "src"}, ] include = [ { path = "src/resources" }, ] [tool.poetry.dependencies] python = ">=3.6" requests="^2.28.1" [tool.poetry.scripts] my-projectttttttt = "my_projectttttttt.__main__:main"
遇到的问题:执行poetry build后,归档文件的src/目录下同时存在模块和resources文件夹,但发布后通过pip install安装,site-packages下的模块目录里只有__init__.py和__main__.py,resources文件夹缺失。
解决方案
错误原因
你当前的include配置仅将src/resources打包进了归档的src目录,但Poetry安装时只会把packages字段指定的my_projectttttttt模块(来自src)复制到site-packages对应目录,src/resources属于模块外的独立目录,不会被自动迁移到模块安装路径,因此安装后看不到。
修正方法
方法1:将资源移到模块目录内(推荐)
- 调整项目结构,把
src/resources文件夹移动到src/my_projectttttttt目录下,结构变为:
├───src │ └───my_projectttttttt │ __init__.py │ __main__.py │ resources │ my_projectttttttt.png
- 修改
pyproject.toml,二选一即可:
方式A:修改packages字段
packages = [ { include = "my_projectttttttt", from = "src", include = ["resources/**/*"] }, ]
方式B:添加package.data配置
[tool.poetry.package.data] "my_projectttttttt" = ["resources/*"]
方法2:保持资源在src同级(不推荐)
如果必须保留src/resources的位置,修改include配置指定资源安装后的目标路径:
include = [ { path = "src/resources", target = "my_projectttttttt/resources" }, ]
这样打包时会把src/resources内容放到归档的my_projectttttttt/resources目录,安装后就会出现在site-packages的模块目录下。
验证
修改后执行poetry build,解压生成的whl文件,检查my_projectttttttt目录下是否包含resources文件夹,确认无误后再发布安装。
内容的提问来源于stack exchange,提问作者George Wright
相关产品推荐
相关产品推荐

