我正在从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时,是否有任何参数可以传递给它,告诉它安装它可以安装的包,跳过它不能安装的包,或者在它看到某些失败时立即退出?


当前回答

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

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

逻辑:对于文件(requirements.txt)中的每个依赖项,安装它们并忽略以“#”开头的依赖项。

其他回答

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

cat requirements.txt | xargs -n 1 pip install

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

这个解决方案可以处理requirements.txt中的空行、空格行、#注释行、空格-然后-#注释行。

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

这是sed魔术的答案。

另一种选择是使用pip install—dry-run来获得需要安装的包的列表,然后继续尝试并删除不能工作的包。

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

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

Windows:

import os
from pip.__main__ import _main as main

error_log = open('error_log.txt', 'w')

def install(package):
    try:
        main(['install'] + [str(package)])
    except Exception as e:
        error_log.write(str(e))

if __name__ == '__main__':
    f = open('requirements1.txt', 'r')
    for line in f:
        install(line)
    f.close()
    error_log.close()

创建一个本地目录,并将requirements.txt文件放在其中。 复制上面的代码,并将其保存为同一个目录中的python文件。记住使用.py扩展名,例如install_packages.py 使用cmd: python install_packages.py运行该文件 所有提到的包都将一次性安装,完全不会停止。:)

您可以在安装函数中添加其他参数。如: Main (['install'] + [str(package)] +['——update'])