使用requirements.tx安装时,阻止pip在单个包上失败

2024-03-28 19:52:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: installpip文件命令txt参数评论lxml
3条回答

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

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

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

cat requirements.txt | xargs -n 1 pip install

注意:-a参数在MacOS下不可用,因此旧的cat更便于移植。

相关问题 更多 >