Comment installer des packages hors ligne?

160

Quelle est la meilleure façon de télécharger un package python et ses dépendances à partir de pypi pour une installation hors ligne sur une autre machine? Existe-t-il un moyen simple de le faire avec pip ou easy_install? J'essaie d'installer la bibliothèque de requêtes sur une boîte FreeBSD qui n'est pas connectée à Internet.

Chris Drantz
la source

Réponses:

77

Si le package est sur PYPI, téléchargez-le et ses dépendances dans un répertoire local. Par exemple

$ mkdir / pypi && cd / pypi
$ ls -la
  -rw-r - r-- 1 bâton pavel 237954 19 avril 11:31 Flask-WTF-0.6.tar.gz
  -rw-r - r-- 1 bâton pavel 389741 22 février 17:10 Jinja2-2.6.tar.gz
  -rw-r - r-- 1 portée pavel 70305 11 avril 00:28 MySQL-python-1.2.3.tar.gz
  -rw-r - r-- 1 bâton pavel 2597214 10 avril 18:26 SQLAlchemy-0.7.6.tar.gz
  -rw-r - r-- 1 bâton pavel 1108056 22 février 17:10 Werkzeug-0.8.2.tar.gz
  -rw-r - r-- 1 bâton pavel 488207 10 avril 18:26 boto-2.3.0.tar.gz
  -rw-r - r-- 1 bâton de pavel 490192 16 avril 12:00 flask-0.9-dev-2a6c80a.tar.gz

Certains paquets peuvent devoir être archivés à la main dans des archives tar similaires. Je le fais souvent quand je veux une version plus récente (moins stable) de quelque chose. Certains forfaits ne sont pas sur PYPI, donc la même chose s'applique à eux.

Supposons que vous ayez une application Python correctement formée dans ~/src/myapp. ~/src/myapp/setup.pyaura une install_requiresliste qui mentionne une ou plusieurs choses que vous avez dans votre /pypirépertoire. Ainsi:

  install_requires=[
    'boto',
    'Flask',
    'Werkzeug',
    # and so on

Si vous voulez pouvoir exécuter votre application avec toutes les dépendances nécessaires tout en la piratant, vous ferez quelque chose comme ceci:

$ cd ~ / src / monapp
$ python setup.py develop --always-unzip --allow-hosts = Aucun --find-links = / pypi

De cette façon, votre application sera exécutée directement à partir de votre répertoire source. Vous pouvez pirater des choses, puis réexécuter l'application sans rien reconstruire.

Si vous souhaitez installer votre application et ses dépendances dans l'environnement python actuel, vous ferez quelque chose comme ceci:

$ cd ~ / src / monapp
$ easy_install --always-unzip --allow-hosts = Aucun --find-links = / pypi.

Dans les deux cas, la construction échouera si une ou plusieurs dépendances ne sont pas présentes dans le /pypirépertoire. Il n'essaiera pas d'installer les éléments manquants d'Internet de manière promiscue.

Je recommande fortement d'appeler setup.py develop ...et easy_install ...dans un environnement virtuel actif pour éviter de contaminer votre environnement Python global. C'est (virtualenv) à peu près la voie à suivre. N'installez jamais rien dans l'environnement Python global.

Si la machine sur laquelle vous avez créé votre application a la même architecture que la machine sur laquelle vous souhaitez la déployer, vous pouvez simplement archiver l'intégralité du répertoire de l'environnement virtuel dans lequel vous avez easy_installtout placé. Mais juste avant la tarball, vous devez rendre le répertoire de l'environnement virtuel relocalisable (voir l' option --relocatable ). REMARQUE: la machine de destination doit avoir la même version de Python installée, et toutes les dépendances basées sur C que votre application peut avoir doivent également y être préinstallées (par exemple, si vous dépendez de PIL , libpng, libjpeg, etc. doivent être préinstallées) .

Pavel Repin
la source
3
Au lieu de cela, --allow-hosts=Nonevous pouvez utiliser le commutateur--no-index
romor
Pouvez-vous expliquer comment créer une application Python correctement formée?
psr du
3
@PrabhjotRai veuillez vous référer à packaging.python.org/distributing
Pavel Repin
300

La downloadcommande pip vous permet de télécharger des packages sans les installer:

pip download -r requirements.txt

(Dans les versions précédentes de pip, cela était orthographié pip install --download -r requirements.txt.)

Ensuite, vous pouvez utiliser pip install --no-index --find-links /path/to/download/dir/ -r requirements.txtpour installer ces sdists téléchargés, sans accéder au réseau.

Carl Meyer
la source
problème avec ceci est que les dépendances peuvent avoir d'autres dépendances et celles-ci ne seront pas téléchargées.
vikki
Snake basket (construit au-dessus de pip) téléchargera également les dépendances des dépendances.
vikki
14
@vikki Ce n'est pas vrai, "pip install --download" télécharge également les dépendances, donc les commandes ci-dessus fonctionneront correctement même si vos exigences ont des dépendances supplémentaires. Snake Basket peut faire d'autres choses utiles (jamais utilisées), mais ce n'est certainement pas nécessaire pour cette raison.
Carl Meyer
6
@vikki Je comprends ce que vous dites, mais je vous dis que ce n'est pas vrai :-) Vous devriez en fait essayer avant de poster à nouveau la même affirmation. J'ai juste mis "pytest" dans un requirements.txt, j'ai lancé "pip install --download. -R requirements.txt", et il a téléchargé des sdists pour pytest et sa dépendance setup.py, "py".
Carl Meyer
3
Je pense que cela devrait être: --find-links file:/path/to/some/dir/et vous devriez télécharger et installer avec la même version de pip - sinon cela pourrait échouer
A. Binzxxxxxx
57

Si vous souhaitez installer les bibliothèques python et leurs dépendances hors ligne, terminez de suivre ces étapes sur une machine avec le même système d'exploitation, le même réseau connecté et python installé:

1) Créez un requirements.txtfichier avec un contenu similaire (Remarque - ce sont les bibliothèques que vous souhaitez télécharger):

Flask==0.12
requests>=2.7.0
scikit-learn==0.19.1
numpy==1.14.3
pandas==0.22.0

Une option pour créer le fichier d'exigences consiste à utiliser pip freeze > requirements.txt. Cela listera toutes les bibliothèques de votre environnement. Ensuite, vous pouvez accéder requirements.txtet supprimer ceux qui ne sont pas nécessaires.

2) Exécutez la commande mkdir wheelhouse && pip download -r requirements.txt -d wheelhousepour télécharger les bibliothèques et leurs dépendances dans le répertoirewheelhouse

3) Copiez requirements.txt dans le wheelhouserépertoire

4) Archiver la timonerie wheelhouse.tar.gzavectar -zcf wheelhouse.tar.gz wheelhouse

Ensuite, téléchargez wheelhouse.tar.gzsur votre machine cible:

1) Exécutez tar -zxf wheelhouse.tar.gzpour extraire les fichiers

2) Exécutez pip install -r wheelhouse/requirements.txt --no-index --find-links wheelhousepour installer les bibliothèques et leurs dépendances

chaokunyang
la source
6
C'est la réponse la plus claire avec les étapes appropriées pour un débutant. Merci
kumarharsh
C'est la manière la plus pythonique que j'ai vue jusqu'à présent. Merci!
peluzza
2
mais en suivant vos instructions, quand je suis pip installà la fin, il dit: ERREUR: impossible de trouver une version qui satisfait à l'exigence ..`
DennisLi
@DennisLi quelle est votre version de python et pip?
chaokunyang le
J'ai compris cela, c'est parce que pip ne peut pas trouver la version spécifique du paquet pandas dans mon requirements.txt, car j'ai utilisé pip3 pour installer les pandas 0.2
DennisLi
13

python hors ligne. pour ce faire, j'utilise virtualenv (environnement Python isolé)

1) Installez virtualenv en ligne avec pip:

pip install virtualenv --user

ou hors ligne avec whl: allez sur ce lien , téléchargez la dernière version (.whl ou tar.gz) et installez-la avec cette commande:

pip install virtualenv-15.1.0-py2.py3-none-any.whl --user

en utilisant, --uservous n'avez pas besoin d'utiliser sudo pip….

2) utiliser virtualenv

sur la machine en ligne, sélectionnez un répertoire avec terminal cdet exécutez ce code:

python -m virtualenv myenv
cd myenv
source bin/activate
pip install Flask

après avoir installé tous les packages, vous devez générer un requirements.txtalors pendant que votre virtualenv est actif, écrivez

pip freeze > requirements.txt

ouvrez un nouveau terminal et créez un autre env comme myenv2.

python -m virtualenv myenv2
cd myenv2
source bin/activate
cd -
ls

maintenant, vous pouvez accéder à votre dossier hors connexion où se trouvent vos dossiers requirements.txtet tranferred_packages. téléchargez les packages avec le code suivant et placez-les tous dans un tranferred_packagesdossier.

pip download -r requirements.txt

amenez votre dossier hors ligne sur un ordinateur hors ligne, puis

python -m virtualenv myenv2
cd myenv2
source bin/activate
cd -
cd offline
pip install --no-index --find-links="./tranferred_packages" -r requirements.txt

ce qu'il y a dans le dossier hors ligne [requirements.txt, tranferred_packages {Flask-0.10.1.tar.gz, ...}]

liste de contrôle de votre colis

pip list

note: comme nous le sommes en 2017, il est préférable d'utiliser python 3. vous pouvez créer python 3 virtualenv avec cette commande.

virtualenv -p python3 envname
cyera
la source
2
Il semble y avoir des étapes manquantes ou "obscurcies" ici, je m'attendrais à voir un 'désactiver' puis 'pip freeze' ... cd hors ligne et ./tranferred_packages apparaît de nulle part - clairement cela nécessite un nettoyage?
Hannu
peut-être, mais vous devriez considérer «je voulais un bref post», «ce processus était complexe et je ne pouvais pas écrire chaque étape (cela n'est possible que sur YouTube)».
cyera
C'est la meilleure réponse à mon humble avis. A beaucoup aidé
webofmars
Ce serait la meilleure réponse si elle disait quoi que ce soit sur la façon de configurer le dossier tranferred_packages. Sans étapes cruciales, -1
Zim
8

Téléchargez l' archive tar , transférez-la sur votre machine FreeBSD et extrayez-la, puis exécutez python setup.py installet vous avez terminé!

EDIT: Juste pour ajouter à cela, vous pouvez également installer les archives tar avec pip maintenant.

dav1d
la source
1
Qu'en est-il de toutes les dépendances? Quelle est la meilleure façon de les résoudre? Dois-je également installer les dépendances manuellement?
Chris Drantz
Oui, c'est malheureusement le seul moyen que je connaisse.
dav1d
8

Permettez-moi de parcourir le processus étape par étape:

  1. Sur un ordinateur connecté à Internet, créez un dossier.
   $ mkdir packages
   $ cd packages
  1. ouvrez une invite de commande ou un shell et exécutez la commande suivante:

    Supposons que le package souhaité soit tensorflow

    $ pip download tensorflow

  2. Maintenant, sur l'ordinateur cible, copiez le packagesdossier et appliquez la commande suivante

  $ cd packages
  $ pip install 'tensorflow-xyz.whl' --no-index --find-links '.'

Notez que le tensorflow-xyz.whl doit être remplacé par le nom d'origine du package requis.

arunanshub
la source
6

En utilisant wheel packages compilés.

regrouper:

$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
$ pip wheel -r requirements.txt --wheel-dir=$tempdir
$ cwd=`pwd`
$ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *)

copiez l'archive tar et installez:

$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
$ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2)
$ pip install --force-reinstall --ignore-installed --upgrade --no-index --no-deps $tempdir/*

Remarque wheel les packages binaires ne sont pas répartis sur plusieurs machines.

Plus de réf. ici: https://pip.pypa.io/en/stable/user_guide/#installation-bundles

Eshizhan
la source
1
J'ai eu des problèmes avec le regroupement sur une machine avec Python 3.6 et l'extraction sur une autre avec Python 3.5: " <package> .whl n'est pas une roue prise en charge sur cette plate-forme ". Les versions source et de destination peuvent être nécessaires pour correspondre à certains packages.
Juuso Ohtonen
6

J'avais un problème similaire. Et j'ai dû le faire installer de la même manière que nous le faisons depuis pypi.

J'ai fait les choses suivantes:

  1. Créez un répertoire pour stocker tous les packages de la machine ayant accès à Internet.

    mkdir -p /path/to/packages/
  2. Téléchargez tous les packages sur le chemin

    pip download -r requirements.txt -d /path/to/packages
    
    Eg:- ls /root/wheelhouse/  # **/root/wheelhouse** is my **/path/to/packages/**
    total 4524
    -rw-r--r--. 1 root root   16667 May 23  2017 incremental-17.5.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   34713 Sep  1 10:21 attrs-18.2.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root 3088398 Oct 15 14:41 Twisted-18.9.0.tar.bz2
    -rw-r--r--. 1 root root  133356 Jan 28 15:58 chardet-3.0.4-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  154154 Jan 28 15:58 certifi-2018.11.29-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   57987 Jan 28 15:58 requests-2.21.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   58594 Jan 28 15:58 idna-2.8-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  118086 Jan 28 15:59 urllib3-1.24.1-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   47229 Jan 28 15:59 tqdm-4.30.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root    7922 Jan 28 16:13 constantly-15.1.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  164706 Jan 28 16:14 zope.interface-4.6.0-cp27-cp27mu-manylinux1_x86_64.whl
    -rw-r--r--. 1 root root  573841 Jan 28 16:14 setuptools-40.7.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   37638 Jan 28 16:15 Automat-0.7.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   37905 Jan 28 16:15 hyperlink-18.0.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   52311 Jan 28 16:15 PyHamcrest-1.9.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   10586 Jan 28 16:15 six-1.12.0-py2.py3-none-any.whl
  3. Tarez le répertoire des packages et copiez-le sur la machine qui n'a pas accès à Internet. Alors fais,

    cd /path/to/packages/
    tar -cvzf packages.tar.gz .  # not the . (dot) at the end

    Copiez le package.tar.gz sur la machine de destination qui n'a pas accès à Internet.

  4. Sur la machine qui n'a pas d'accès Internet, procédez comme suit (en supposant que vous avez copié les packages goudronnés dans / chemin / vers / package / dans la machine actuelle)

    cd /path/to/packages/
    tar -xvzf packages.tar.gz
    mkdir -p $HOME/.config/pip/
    
    vi $HOME/.config/pip/pip.conf

    et collez le contenu suivant à l'intérieur et enregistrez-le.

    [global]
    timeout = 10
    find-links = file:///path/to/package/
    no-cache-dir = true
    no-index = true
  5. Enfin, je vous suggère d'utiliser une forme de virtualenvpour installer les paquets.

    virtualenv -p python2 venv # use python3, if you are on python3
    source ./venv/bin/activate
    pip install <package>

Vous devriez pouvoir télécharger tous les modules qui se trouvent dans le répertoire / chemin / vers / package / .

Remarque: je n'ai fait que cela, car je ne pouvais pas ajouter d'options ou modifier la façon dont nous installons les modules. Sinon j'aurais fait

    pip install --no-index --find-links /path/to/download/dir/ -r requirements.txt
Han Solo
la source
3

Pour Pip 8.1.2, vous pouvez utiliser pip download -r requ.txtpour télécharger des packages sur votre machine locale.

Umut Gunebakan
la source