如何使用Poetry导出requirements.txt时排除指定依赖?
我有一个Python3 Poetry项目,pyproject.toml的依赖配置如下:
[tool.poetry.dependencies] python = "^3.10" nltk = "^3.7" numpy = "^1.23.4" scipy = "^1.9.3" scikit-learn = "^1.1.3" joblib = "^1.2.0" [tool.poetry.dev-dependencies] pytest = "^5.2"
使用命令poetry export --without-hashes -f requirements.txt --output requirements.txt导出的requirements.txt中包含了colorama:
click==8.1.3 ; python_version >= "3.10" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Windows" joblib==1.2.0 ; python_version >= "3.10" and python_version < "4.0" nltk==3.8.1 ; python_version >= "3.10" and python_version < "4.0" numpy==1.24.1 ; python_version >= "3.10" and python_version < "4.0" regex==2022.10.31 ; python_version >= "3.10" and python_version < "4.0" scikit-learn==1.2.1 ; python_version >= "3.10" and python_version < "4.0" scipy==1.9.3 ; python_version >= "3.10" and python_version < "4.0" threadpoolctl==3.1.0 ; python_version >= "3.10" and python_version < "4.0" tqdm==4.64.1 ; python_version >= "3.10" and python_version < "4.0"
在Linux环境的Docker镜像构建时,执行pip install -r requirements.txt会出现提示:
Ignoring colorama: markers 'python_version >= "3.10" and python_version < "4.0" and platform_system == "Windows"' don't match your environment
colorama是pytest的依赖,仅用于Windows终端着色,Linux环境下不需要,希望导出时直接排除它,避免这个提示。目前用grep -v colorama过滤的方式不够优雅,担心依赖声明跨多行时失效,求更优方案。
方案1:使用Poetry的--exclude参数(Poetry 1.2+支持)
Poetry 1.2及以上版本的export命令支持--exclude参数,可直接指定要排除的依赖包,这是官方原生支持的最优方案:
poetry export --without-hashes -f requirements.txt --exclude colorama --output requirements.txt
方案2:在pyproject.toml中永久排除依赖
如果需要长期排除该依赖,可以在pyproject.toml中对pytest的依赖进行调整,明确排除colorama:
[tool.poetry.dev-dependencies] pytest = { version = "^5.2", exclude = ["colorama"] }
修改后再执行导出命令,colorama就不会出现在生成的requirements.txt中。
方案3:针对Docker环境指定平台标记
因为colorama的依赖标记仅针对Windows平台,导出时可以指定目标平台为Linux,让Poetry自动过滤不符合平台的依赖:
poetry export --without-hashes -f requirements.txt --platform linux --output requirements.txt
这个方法不仅能排除colorama,还会自动过滤其他仅适配Windows的依赖,适合Docker这类特定环境的场景。
内容的提问来源于stack exchange,提问作者Rulle

