关于python:使用requirements.txt进行安装时,停止单个包上的pip失败

Stop pip from failing on single package when installing with requirements.txt

我正在安装requirements.txt中的包

pip install -r requirements.txt

requirements.txt文件显示:

1
2
3
4
5
6
Pillow
lxml
cssselect
jieba
beautifulsoup
nltk

lxml是唯一一个安装失败的软件包,这导致了所有的失败(如Larsks在评论中指出的预期结果)。但是,在lxml失败后,pip仍然运行并下载其余的包。

据我所知,如果requirements.txt中列出的任何软件包安装失败,pip install -r requirements.txt命令将失败。

在运行pip install -r requirements.txt时,有没有什么可以说服它安装它能安装的东西,跳过它不能安装的包,或者在它看到失败时立即退出的理由?


使用pip install运行每条线路可能是一种解决方案。

1
cat requirements.txt | xargs -n 1 pip install

注:MacOS下没有-a参数,所以旧的cat更便于携带。


对于Windows:

PIP版本>=18

1
2
3
4
5
6
7
8
9
10
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

1
2
3
4
5
6
7
8
9
10
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)


xargs解决方案可以工作,但可能存在可移植性问题(BSD/GNU),并且/或者如果您的需求文件中有注释或空行,那么会很麻烦。

对于需要这种行为的用例,我使用两个单独的需求文件,一个只列出需要始终安装的核心依赖项,另一个具有非核心依赖项的文件占大多数用例不需要的90%。这相当于debian包的Recommends部分。

我使用以下shell脚本(需要sed来安装可选的依赖项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh

while read dependency; do
    dependency_stripped="$(echo"${dependency}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
    # Skip comments
    if [[ $dependency_stripped == \#* ]]; then
        continue
    # Skip blank lines
    elif [ -z"$dependency_stripped" ]; then
        continue
    else
        if pip install"$dependency_stripped"; then
            echo"$dependency_stripped is installed"
        else
            echo"Could not install $dependency_stripped, skipping"
        fi
    fi
done < recommends.txt

谢谢,Etienne Prothon为Windows案件。

但是,在升级到pip 18之后,pip包不会向公众公开main。所以您可能需要像这样更改代码。

1
2
3
4
5
6
7
8
9
10
11
 # This code install line by line a list of pip package
 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)

此解决方案处理Requirements.txt中的空行、空白行、注释行、空白然后注释行。

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

这是SED魔术的答案。


您对lxml的使用有要求吗?它们在这里安装:

1
sudo apt-get install libxml2-dev libxslt-dev python-dev

如果您使用Windows或Mac,也可以进行检查。或者,设置static_deps=true将自动下载并构建两个库。(c)http://lxml.de/installation.html