web-dev-qa-db-fra.com

Comment spécifier l'ordre d'installation pour python pip?

Je travaille avec fabric (0.9.4) + pip (0.8.2) et je dois installer des modules python pour plusieurs serveurs. Tous les serveurs ont une ancienne version de setuptools (0.6c8) qui doit être mis à niveau pour le module pymongo. Pymongo nécessite setuptools> = 0.6c9.

Mon problème est que pip démarre l'installation avec pymongo au lieu de setuptools, ce qui provoque l'arrêt de pip. La lecture aléatoire de l'ordre des modules dans le fichier d'exigences ne semble pas aider.

requirements.txt:

setuptools>=0.6c9
pymongo==1.9
simplejson==2.1.3

Existe-t-il un moyen de spécifier l'ordre d'installation pour pip car il ne semble pas le faire correctement par lui-même?

Cela peut être résolu avec deux fichiers d'exigences distincts, mais ce serait bien si je n'avais pas besoin de maintenir plusieurs fichiers d'exigences maintenant ou à l'avenir.

Le problème persiste avec pip 0.8.3.

54
Seppo Erviälä

Ceci est un hack stupide, mais pourrait bien fonctionner. Écrivez un script bash qui lit dans votre fichier d'exigences ligne par ligne et exécute la commande pip dessus.

#!/bin/bash
for line in $(cat requirements.txt)
do
  pip install $line -E /path/to/virtualenv
done
12
rubayeet

Vous pouvez simplement utiliser:

cat requirements.txt | xargs pip install
26
lucasr300

Pour autoriser tous les types d'entrées (par exemple les packages des référentiels git) dans requirements.txt, vous devez utiliser l'ensemble de commandes suivant

cat requirements.txt | xargs -n 1 -L 1 pip install

Les options - n 1 et - L 1 sont nécessaires pour installer les packages un par un et traiter chaque ligne du fichier requirements.txt comme un élément distinct.

12
Chris Gorgolewski

Malheureusement, la suggestion de mise à niveau ne fonctionnera pas. Si vous lisez les autres détails dans https://github.com/pypa/pip/issues/24 vous comprendrez pourquoi

pip construira tous les packages en premier, avant de tenter de les installer. Donc, avec un fichier d'exigences comme le suivant

numpy==1.7.1
scipy==0.13.2
statsmodels==0.5.0

La construction des modèles de statistiques échouera avec la déclaration suivante

ImportError: statsmodels requires numpy

La solution de contournement donnée pour appeler manuellement pip pour chaque entrée dans le fichier d'exigences (via un script Shell) semble être la seule solution actuelle.

9
Kevin Campbell

Pymongo nécessite setuptools> = 0.6c9

Comment le sais-tu? Nécessite de construire ou d'installer? Vous ne dites pas quelle version de Pymongo vous essayez d'installer mais regardez setup.py fichier pour la version actuelle (3.2.2) il n'y a aucune spécification ni de ce dont Pymongo a besoin pour exécuter setup.py (setup_requires) ni ce qu'il faut pour installer (install_requires). Sans ces informations, pip ne peut pas garantir une version spécifique de setuptools. Si Pymongo nécessite une version spécifique de setuptools pour exécuter son setup.py (au lieu d'exiger que setuptools exécute la fonction setup elle-même), alors l'autre problème est que jusqu'à récemment il n'y avait aucun moyen de le spécifier. Maintenant, il y a des spécifications - PEP 518 - Spécification de la configuration système minimale requise pour Python Projets , qui devrait être prochainement implémenté dans pip - Implémenter le support PEP 518 # 3691 .

Quant à l'ordre d'installation, cela a été corrigé dans le pip 6.1.0;

Depuis installation de pip - Ordre d'installation section de la documentation de pip:

Depuis la version 6.1.0, pip installe les dépendances avant leurs dépendants, c'est-à-dire dans "l'ordre topologique". Il s'agit du seul engagement pip actuellement pris concernant la commande.

Et ensuite:

Avant la version 6.1.0, pip ne prenait aucun engagement concernant l'ordre d'installation.

Cependant, sans une spécification appropriée des exigences par Pymongo, cela n'aidera pas non plus.

5
Piotr Dobrogost

Si vous avez des commentaires dans votre fichier d'exigences, vous voudrez utiliser:

grep -v "^#" requirements.txt | xargs pip install
4
Jason V.

Dans le prolongement de la solution de @ lukasrms - je devais le faire pour que pip installe mes exigences une par une:

cat requirements.txt | xargs -n 1 pip install
4
Leo

J'ai fini par exécuter pip dans virtualenv au lieu d'utiliser "pip -E" car avec -E pip pouvait toujours voir les packages de site des serveurs et cela a évidemment gâché certaines des installations.

J'ai également eu des problèmes avec des serveurs sans virtualenvs. Même si j'installais setuptools avec une commande pip séparée, pymongo refuserait d'être installé.

J'ai résolu ce problème en installant setuptools séparément avec easy_install car cela semble être un problème entre pip et setuptools.

extraits de fabfile.py:

env.activate = "source %s/bin/activate" % virtualenv_path

_virtualenv("easy_install -U setuptools")
_virtualenv("pip install -r requirements.txt")

def _virtualenv(command)
    if env.virtualenv:
        Sudo(env.activate + "&&" + command)
    else:
        Sudo(command)

J'ai eu ces problèmes avec pip 0.8.3 et 0.8.2.

1
Seppo Erviälä

Désolé, ma première réponse était fausse, car j'avais setuptools> = 0.6c9.

Il semble que ce ne soit pas possible car setup.py de pymongo a besoin de setuptools> = 0.6c9, mais pip n'a téléchargé que setuptools> = 0.6c9, et n'est pas encore installé.

Quelqu'un en a discuté dans le numéro que j'ai signalé précédemment.

J'ai moi-même créé un problème à ce sujet il y a quelques semaines: Ne pas exécuter Egg_info à chaque package dans la liste des exigences avant d'installer les packages précédents .

Désolé pour le bruit.


Première réponse:

Mettez à jour votre pip vers la version 0.8.3, il a un correction de bogue à l'ordre d'installation .

Maintenant, si vous mettez à niveau, tout fonctionne :-)

Consultez l'actualité ici: http://www.pip-installer.org/en/0.8.3/news.html

0
Hugo Tavares