我正在从requirements.txt安装包

pip install -r requirements.txt

requirements.txt文件如下:

Pillow
lxml
cssselect
jieba
beautifulsoup
nltk

LXML是唯一一个安装失败的包,这会导致一切失败(正如larsks在评论中指出的那样,这是预期的结果)。但是,在lxml失败之后,pip仍然运行并下载其余的包。

根据我的理解,如果requirements.txt中列出的任何一个包安装失败,pip install -r requirements.txt命令将失败。

当运行pip install -r requirements.txt时,是否有任何参数可以传递给它,告诉它安装它可以安装的包,跳过它不能安装的包,或者在它看到某些失败时立即退出?


当前回答

一个非常一般的解

下面的代码安装所有的需求:

多个需求文件(requests1 .txt, requients2 .txt) 忽略带有注释#的行 跳过不可安装的包 运行PIP安装每一行(而不是像其他答案中的每个单词)

$ (cat requirements1.txt; echo ""; cat requirements2.txt) | grep "^[^#]" | xargs -L 1 pip install

其他回答

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)

一行PowerShell:

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

如果你需要忽略某些行,那么:

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

OR

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

基于@MZD的回答,这里有一个解决方案,可以过滤掉所有以注释符号#开头的文本

cat requirements.txt | grep -Eo '(^[^#]+)' | xargs -n 1 pip install

使用pip install运行每一行可能是一种变通办法。

cat requirements.txt | xargs -n 1 pip install

注意:-a参数在MacOS下不可用,所以old cat更便于移植。

对于使用PowerShell的Windows:

foreach($line in Get-Content requirements.txt) {
    if(!($line.StartsWith('#'))){
        pip install $line
    }
}