Toutes les dépendances ne sont pas téléchargés avec "pip télécharger"

j'essaie de configurer un répertoire local avec des paquets qui peuvent être réutilisés pour l'installation sur une machine sans connexion internet mais j'ai des problèmes avec certains paquets.

je télécharge d'abord les paquets avec

pip download -r requirements.txt -d my_packages --no-binary :all:

Et puis j'essaie de les installer avec

pip install -r requirements.txt --no-index -f my_packages

un des paquets que j'ai du mal à installer est elasticsearch-dsl==6.1.0:

pip install -r requirements --no-index -f my_packages
Looking in links: my_packages
Collecting elasticsearch-dsl==6.1.0
Collecting six (from elasticsearch-dsl==6.1.0)
Collecting python-dateutil (from elasticsearch-dsl==6.1.0)
  Installing build dependencies ... error
  Complete output from command /Users/Oskar/.pyenv/versions/2.7.15/envs/no_internet/bin/python2.7 -m pip install --ignore-installed --no-user --prefix /private/var/folders/36/t0_t6_td2f560t2j0149vjmw0000gn/T/pip-build-env-moib0N --no-warn-script-location --no-binary :none: --only-binary :none: --no-index --find-links my_packages -- setuptools wheel:
  Looking in links: my_packages
  Collecting setuptools
    Could not find a version that satisfies the requirement setuptools (from versions: )
  No matching distribution found for setuptools

bien Sûr setuptools je peux installer manuellement mais il y a plus de paquets que ce qui est requis pour tous les autres paquets. django-guardian==1.4.9 est un autre exemple qui nécessite pytest-runner ce qui n'est pas téléchargé avec pip download

8
demandé sur Oskar Persson 2018-08-08 16:33:09

3 réponses

Utiliser pip wheel au lieu de pip download, de pré-télécharger et compiler vos dépendances.

$ pip install wheel
$ pip wheel -w my_wheels python-dateutil --no-binary :all:
$ pip install -f my_wheels --no-index python-dateutil    # works
$ pip install -f my_packages --no-index python-dateutil  # breaks

pip wheel construit le python-dateutil le paquet, de sorte que vous n'avez pas besoin d' setuptools_scm plus tard pendant pip install.

d'Après les docs,

Roue est équipé d'un format de paquet, et offre l'avantage de ne pas recompiler votre logiciel à chaque installation.

par conséquent, je présume que pip wheel va utiliser les dépendances de construction de temps, telles que setuptools_scm, mais pip install ne pas, depuis le .whl a été construit.

--no-binary :all: option fait encore la bonne chose: télécharge la source dans .tar.gz au lieu des distributions binaires.

(jwodder a été astucieux en soulignant les différences entre les dépendances d'exécution i.e.install_requires et au moment de la construction des dépendances i.e.setup_requires.)

j'ai testé cela sur un environnement local, et pas de setuptools_scm et pas pytest-runner, pas de problème.

(py3) j@computer:~/so-examples|⇒ pip freeze
django-guardian==1.4.9
python-dateutil==2.7.3
six==1.11.0
4
répondu James Lim 2018-08-20 22:10:23

Parce que vous avez spécifié --no-binary :all:, pip ne télécharge que des sdists pour les paquets et ne télécharge pas de roues. Cependant, pip a toujours besoin de chaque paquet en forme de roue au moment de l'installation, et donc pip install essaie de construire une roue pour chaque paquet du sdist, et cette étape nécessite setuptools, wheel, et rien énumérées dans le paquet setup_requires. Je ne sais pas pourquoi votre environnement n'a pas setuptools, mais tout environnement Python sain devrait avoir à la fois cela et wheel installé lorsque l'environnement est créé.

Malheureusement pour vous, les paquets listés dans setup_requires sont installés par setuptools plutôt que par pip, donc pip download n'a aucun moyen de capturer ces exigences. Si vous insistez sur l'utilisation de --no-binary :all:, alors la seule solution est de compiler manuellement une liste des paquets qui manquent quand pip install exécute, les télécharge, puis installe les paquets manquants avant ceux qui en dépendent ou bien configurer setuptools pour regarder pour les téléchargements my_packages. Heureusement, la liste sera probablement assez courte (probablement juste pytest-runner et setuptools_scm).

3
répondu jwodder 2018-08-12 17:39:49

Vous pouvez utiliser pip2pi pour éviter de réinventer la roue, c'est un outil très pratique pour créer votre propre PIP repos. Je maintiens un miroir pypi partiel pour mon équipe et j'ai eu les meilleurs résultats avec ce projet.

à Partir de sa page Github: "pip2pi construit une PyPI-compatible dépôt de paquets de pip exigences"

$ pip install pip2pi
$ mkdir packages
$ pip2tgz packages/ -r requirements.txt
$ dir2pi -n packages/ # <--- this builds/updates the index, i.e. the "simple/" directory

maintenant, servez simplement les paquets / simple / folder via http et utilisez-le comme votre index.

$ pip install -i http://myserver.net/simple/ -r requirements.txt

Pour éviter les tracas de vérification de sécurité pip vous pouvez ajuster votre pip.conf comme ceci:

[global]
format=columns
disable_pip_version_check = 1
index-url=file:http://myserver.net/simple/

Maintenant vous pouvez installer depuis votre propre miroir avec lepip install la commande.

2
répondu MGP 2018-08-12 17:53:11