如何修改Poetry构建的pip包安装路径到其他包指定目录
实现方案
首先明确结论:仅修改pyproject.toml配置无法直接实现该需求,同时这种将独立包文件写入其他第三方包目录的操作不符合Python打包规范,会带来几个已知问题:
- other_pack后续升级、卸载时不会清理你写入的my_pack文件,会产生残留垃圾
- 如果my_pack内文件和other_pack/internal_directory下原有文件重名,会直接覆盖导致原包功能异常
- 如果目标环境没提前装other_pack,安装my_pack时会直接在site-packages下新建冗余的other_pack目录,和真正的other_pack包产生路径冲突
如果你的业务场景必须实现该安装逻辑,可以按以下步骤操作:
操作步骤
- 调整本地my_pack项目的源码目录结构,提前嵌套和目标安装路径完全一致的层级
原项目结构通常为:
调整为嵌套结构:my_pack_project/ ├── pyproject.toml └── my_pack/ ├── __init__.py └── 其他业务文件my_pack_project/ ├── pyproject.toml └── other_pack/ └── internal_directory/ └── my_pack/ ├── __init__.py └── 其他业务文件 - 修改pyproject.toml中的包路径配置,覆盖Poetry默认的包查找规则,显式指定要打包的目录:
[tool.poetry] name = "my_pack" version = "0.1.0" # 其余原有基础配置(description、authors等)保持不变 packages = [ { include = "other_pack" } ] - 重新构建、安装包即可:
安装时打包工具会把include指定的other_pack目录直接释放到site-packages根目录,如果目标环境已经存在other_pack,目录会自动合并,最终my_pack的文件就会落到你需要的poetry build pip install dist/my_pack-对应版本号-py3-none-any.whlother_pack/internal_directory/路径下。
替代方案(更合规)
如果不是强依赖必须把文件放到other_pack的目录内,更推荐用插件机制、命名空间包的方式实现功能,不要直接修改其他包的目录结构,避免后续升级、环境迁移时出现难以排查的异常。不要尝试用安装后脚本动态移动文件,这类操作在新版pip遵循的PEP 517构建规则下会被限制,在只读环境、离线安装场景下会直接执行失败。
内容的提问来源于stack exchange,提问作者Alexex93
相关产品推荐
相关产品推荐

