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
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.
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
Pour les fenêtres:
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)
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)
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)
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()
requirements.txt
..py
, par exemple, install_packages.py
python install_packages.py
Vous pouvez ajouter d'autres paramètres dans la fonction d'installation. Comme: main(['install'] + [str(package)] + ['--update'])
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.