web-dev-qa-db-fra.com

Empêchez pip d’échouer sur un seul package lors de l’installation avec Requirements.txt

J'installe des paquets à partir de Requirements.txt

pip install -r Requirements.txt

Le fichier exigences.txt se lit comme suit:

Pillow
lxml
cssselect
jieba
beautifulsoup
nltk

lxml est le seul package dont l'installation a échoué, ce qui entraîne l'échec de tout (résultats escomptés, comme l'indiquent les alsks dans les commentaires). Cependant, après l'échec de lxml, pip est toujours exécuté et télécharge le reste des packages. 

D'après ce que j'ai compris, la commande pip install -r requirements.txt échouera si l'un des packages répertoriés dans requirements.txt échoue.

Existe-t-il un argument que je peux utiliser lors de l'exécution de pip install -r requirements.txt pour lui dire d'installer tout ce qu'il peut et d'ignorer les paquets qu'il ne peut pas, ou de quitter dès qu'il voit quelque chose tomber

71
emh

Exécuter chaque ligne avec pip install peut constituer une solution de contournement.

cat requirements.txt | xargs -n 1 pip install

Remarque: Le paramètre -a n’est pas disponible sous MacOS, l’ancien chat est donc plus portable.

126
MZD

La solution xargs fonctionne, mais peut avoir des problèmes de portabilité (BSD/GNU) et/ou être fastidieuse si vous avez des commentaires ou des lignes vides dans votre fichier de configuration.

En ce qui concerne le cas où un tel comportement serait requis, j’utilise par exemple deux fichiers d’exigence distincts, l’un ne répertoriant que les dépendances principales devant toujours être installées et un autre fichier contenant des dépendances non essentielles représentant 90% des cas. pas nécessaire pour la plupart des cas d'utilisation. Ce serait l'équivalent de la section Recommends d'un paquet debian.

J'utilise le script Shell suivant (requiert sed) pour installer les dépendances facultatives :

#!/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
4
Leo Cavaille

Pour les fenêtres:

version pip> = 18

import sys
from pip._internal import main as pip_main

def install(package):
    pip_main(['install', package])

if __== '__main__':
    with open(sys.argv[1]) as f:
        for line in f:
            install(line)

version pip <18

import sys
import pip

def install(package):
    pip.main(['install', package])

if __== '__main__':
    with open(sys.argv[1]) as f:
        for line in f:
            install(line)
4
Etienne Prothon

Merci Etienne Prothon pour les valises Windows. 

Mais, après la mise à niveau vers le pip 18, le package pip n’expose pas le principal au public. Donc, vous devrez peut-être changer le code comme ça. 

 # 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 __== '__main__':
    with open(sys.argv[1]) as f:
        for line in f:
            install(line)
1
Jaeyoon Jeong

Pour les fenêtres:

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 __== '__main__':
    f = open('requirements1.txt', 'r')
    for line in f:
        install(line)
    f.close()
    error_log.close()
  1. Créez un répertoire local et placez-y votre fichier requirements.txt.
  2. Copiez le code ci-dessus et enregistrez-le en tant que fichier python dans le même répertoire. N'oubliez pas d'utiliser l'extension .py, par exemple, install_packages.py
  3. Exécutez ce fichier en utilisant un cmd: python install_packages.py
  4. Tous les paquets mentionnés seront installés en une fois sans aucun arrêt. :)

Vous pouvez ajouter d'autres paramètres dans la fonction d'installation. Comme: main(['install'] + [str(package)] + ['--update'])

0
Pranzell

Cette solution gère les lignes vides, les lignes d’espace, les lignes de commentaire, les lignes de commentaire d’espace, puis de # dans votre Requirements.txt.

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

Chapeau pointe à cette réponse pour la magie sed.

0
rouble