在使用requirements.txt安装时阻止pip因单个包失败

280 投票
12 回答
171443 浏览
提问于 2025-04-17 21:17

我正在从 requirements.txt 文件中安装软件包。

pip install -r requirements.txt

这个 requirements.txt 文件的内容是:

Pillow
lxml
cssselect
jieba
beautifulsoup
nltk

只有 lxml 这个软件包安装失败,这导致其他所有的安装也失败了(正如评论中 larsks 指出的那样)。不过,即使 lxml 安装失败,pip 还是会继续下载其他的软件包。

根据我的理解,运行 pip install -r requirements.txt 这个命令时,如果 requirements.txt 中的任何一个软件包安装失败,整个命令就会失败。

有没有什么参数可以在运行 pip install -r requirements.txt 时传递,让它安装能安装的包,跳过不能安装的包,或者在遇到失败时立即退出?

12 个回答

5

一行PowerShell命令:

Get-Content .\requirements.txt | ForEach-Object {pip install $_}

如果你需要忽略某些行,可以这样写:

Get-Content .\requirements.txt | ForEach-Object {if (!$_.startswith("#")){pip install $_}}

或者你也可以这样:

Get-Content .\requirements.txt | ForEach-Object {if ($_ -notmatch "#"){pip install $_}}

12

对于Windows系统:

如果你的pip版本是18或更高

import sys
from pip._internal import main as pip_main

def install(package):
    pip_main(['install', package])

if __name__ == '__main__':
    with open(sys.argv[1]) as f:
        for line in f:
            install(line)

如果你的pip版本低于18

import sys
import pip

def install(package):
    pip.main(['install', package])

if __name__ == '__main__':
    with open(sys.argv[1]) as f:
        for line in f:
            install(line)
18

对于Windows用户,你可以使用这个:

FOR /F %k in (requirements.txt) DO ( if NOT # == %k ( pip install %k ) )

逻辑是:对于文件中的每一个依赖项(在requirements.txt里),都进行安装,同时忽略那些以"#"开头的行。

35

这个解决方案可以处理你的requirements.txt文件中的空行、只有空格的行、以#开头的注释行,以及先有空格再有#的注释行。

cat requirements.txt | sed -e '/^\s*#.*$/d' -e '/^\s*$/d' | xargs -n 1 pip install

特别感谢这个回答中的sed技巧。

459

逐行运行 pip install 可能是一个解决办法。

cat requirements.txt | xargs -n 1 pip install

注意:-a 这个参数在MacOS上不可用,所以用旧版的cat命令会更通用。

撰写回答