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
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
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
).
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.