使用Requirements.txt安装时,避免在单个软件包上出现故障


138

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

pip install -r requirements.txt

requirements.txt文件显示为:

Pillow
lxml
cssselect
jieba
beautifulsoup
nltk

lxml是唯一无法安装的软件包,这将导致一切失败(larsk在注释中指出了预期的结果)。但是,lxml失败后pip仍会继续运行并下载其余软件包。

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

我在运行时可以传递任何参数pip install -r requirements.txt来告诉它安装可以执行的操作并跳过不能执行的程序包,或者在看到失败后立即退出吗?


3
从您的requirements.txt中删除lxml
RickyA 2014年

1
谢谢,在这种情况下可以使用,但总的来说,有什么办法可以解决?还是只运行命令,看看它失败然后修剪软件包列表是正常的吗?
emh 2014年

5
如果其中列出了某个软件包requirements.txt,则可能是必需软件包,因此,pip如果无法安装该软件包,将导致失败。如果代码在没有该程序包的情况下仍然可以运行,则几乎没有必要。从中随机修剪失败的软件包requirements.txt似乎会导致缺少依赖项的问题。
larsk 2014年

1
@larsks对于一个开发环境或程序包具有多个requirements.txt文件是很常见的。例如,可能有一个完整的可选工具,可用于增强单元/集成测试环境或性能分析,但并非严格要求。您仍然希望对表示这些软件包和任何固定版本的单个源文件进行版本控制,并依靠相同的pip install -r <some file>工作流程来标准化适当环境的创建。
ely

4
鉴于此,建议pip不支持某种类型的正常故障/可选的跳过行为(显示警告但安装了可能的警告)似乎有点失聪。对于需求文件中的这种基于点子的安装,这是非常普遍的需求。
ely

Answers:


230

运行每一行pip install可能是一种解决方法。

cat requirements.txt | xargs -n 1 pip install

注意:该-a参数在MacOS下不可用,因此老猫更便携。


21
对于Mac:cat requirements.txt | xargs -n 1 pip install
Walty Yeung

5
我必须做的是:cat requirements.txt | cut -f1 -d"#" | sed '/^\s*$/d' | xargs -n 1 pip install删除注释中的所有内容并摆脱空行。
Narek '18

1
至少对于GNU xargs,有一个-aflag选项,该选项允许xargs从文件中读取参数,因此可以通过来完成xargs -n 1 -a requirements.txt pip install。防止UUOC和过度管道
谢尔盖Kolodyazhnyy

7
对于Windows :)FOR /F %k in (requirements.txt) DO pip install %k
wcyn19年

即使没有该-a标志,也请考虑< requirements.txt xargs -n 1 pip install,或者如果您不喜欢前面的重定向,请考虑xargs -n 1 pip install < requirements.txt。:-)
torek

10

该解决方案处理您的requirements.txt中的空行,空白行,#注释行,whitespace-then-#注释行。

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

帽尖到这个答案的sed的魔法。


1
效果很好。我用pip freeze代替cat requirements.txt
维沙尔

5

对于Windows:

点版本> = 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)

点版本<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)

“主要”不是点子的一部分。错误。
普拉内塞尔'19

4

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

至于需要这种行为的用例,例如,我使用了两个单独的需求文件,一个仅列出需要始终安装的核心依赖关系,而另一个文件则列出了90%的具有非核心依赖关系的文件。大多数用例都不需要。这相当于Recommendsdebian软件包的这一部分。

我使用以下shell脚本(requires sed)安装可选的依赖项

#!/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

0

谢谢Etienne Prothon提供的Windows保护套。

但是,升级到pip 18后,pip包不会将main公开。因此,您可能需要像这样更改代码。

 # 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)

-1

对于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()
  1. 创建一个本地目录,然后将requirements.txt文件放入其中。
  2. 复制上面的代码,并将其另存为python文件在同一目录中。.py例如,请记住使用扩展名,install_packages.py
  3. 使用cmd运行此文件: python install_packages.py
  4. 提到的所有软件包都将一口气安装起来,而无需停止。:)

您可以在安装功能中添加其他参数。喜欢: main(['install'] + [str(package)] + ['--update'])

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.