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

时间:2014-03-07 12:46:29

标签: python pip

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

8 个答案:

答案 0 :(得分:144)

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

cat requirements.txt | xargs -n 1 pip install

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

答案 1 :(得分: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)

答案 2 :(得分:4)

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

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

我使用以下shell脚本(需要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

答案 3 :(得分:1)

感谢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)

答案 4 :(得分:1)

此解决方案可以处理您的requirements.txt中的空行,空白行,#条注释行,空白-然后-#条注释行。

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

answer的帽子提示,以获取神奇的魔法。

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

对于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'])

答案 7 :(得分:-11)

你有使用lxml的要求吗? 这里是安装:

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

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