Come installare i pacchetti offline?


160

Qual è il modo migliore per scaricare un pacchetto python e le sue dipendenze da pypi per l'installazione offline su un altro computer? C'è un modo semplice per farlo con pip o easy_install? Sto cercando di installare la libreria delle richieste su un box FreeBSD che non è connesso a Internet.


Risposte:


77

Se il pacchetto è su PYPI, scaricarlo e le sue dipendenze in alcune directory locali. Per esempio

$ mkdir / pypi && cd / pypi
$ ls -la
  -rw-r - r-- 1 pavel staff 237954 19 aprile 11:31 Flask-WTF-0.6.tar.gz
  -rw-r - r-- 1 pavel staff 389741 22 feb 17:10 Jinja2-2.6.tar.gz
  -rw-r - r-- 1 pavel staff 70305 11 aprile 00:28 MySQL-python-1.2.3.tar.gz
  -rw-r - r-- 1 pavel staff 2597214 10 aprile 18:26 SQLAlchemy-0.7.6.tar.gz
  -rw-r - r-- 1 pavel staff 1108056 22 feb 17:10 Werkzeug-0.8.2.tar.gz
  -rw-r - r-- 1 pavel staff 488207 10 aprile 18:26 boto-2.3.0.tar.gz
  -rw-r - r-- 1 pavel staff 490192 16 apr 12:00 flask-0.9-dev-2a6c80a.tar.gz

Alcuni pacchetti potrebbero dover essere archiviati manualmente in tarball simili. Lo faccio molto quando voglio una versione più recente (meno stabile) di qualcosa. Alcuni pacchetti non sono su PYPI, quindi lo stesso vale per loro.

Supponiamo di avere un'applicazione Python correttamente formata in ~/src/myapp. ~/src/myapp/setup.pyavrà un install_requireselenco che menziona una o più cose che hai nella tua /pypidirectory. Così:

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

Se vuoi essere in grado di eseguire la tua app con tutte le dipendenze necessarie mentre fai ancora hack su di essa, farai qualcosa del genere:

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

In questo modo la tua app verrà eseguita direttamente dalla tua directory di origine. Puoi hackerare le cose e quindi rieseguire l'app senza ricostruire nulla.

Se vuoi installare la tua app e le sue dipendenze nell'attuale ambiente Python, farai qualcosa del genere:

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

In entrambi i casi, la compilazione non riuscirà se una o più dipendenze non sono presenti nella /pypidirectory. Non tenterà di installare in modo promiscuo cose mancanti da Internet.

Consiglio vivamente di invocare setup.py develop ...e easy_install ...all'interno di un ambiente virtuale attivo per evitare di contaminare il tuo ambiente Python globale. È (virtualenv che è) praticamente la strada da percorrere. Non installare mai nulla nell'ambiente Python globale.

Se la macchina su cui hai creato la tua app ha la stessa architettura della macchina su cui vuoi distribuirla, puoi semplicemente tarball l'intera directory dell'ambiente virtuale in cui hai easy_installinserito tutto. Poco prima del tarballing, tuttavia, è necessario rendere riposizionabile la directory dell'ambiente virtuale (vedere l' opzione --relocatable ). NOTA: sul computer di destinazione deve essere installata la stessa versione di Python e anche eventuali dipendenze basate su C che l'app potrebbe avere devono essere preinstallate lì (ad esempio, se si dipende da PIL , è necessario preinstallare libpng, libjpeg, ecc.) .


3
Invece di --allow-hosts=Nonete puoi usare l'interruttore--no-index
romor

Potete per favore elaborare come creare un'applicazione Python correttamente formata?
psr

3
@PrabhjotRai, fare riferimento a packaging.python.org/distributing
Pavel Repin,

300

Il downloadcomando pip consente di scaricare i pacchetti senza installarli:

pip download -r requirements.txt

(Nelle versioni precedenti di pip, questo era scritto pip install --download -r requirements.txt.)

Quindi è possibile utilizzare pip install --no-index --find-links /path/to/download/dir/ -r requirements.txtper installare quegli sdist scaricati, senza accedere alla rete.


problema con questo è che le dipendenze potrebbero avere altre dipendenze e quelle non verranno scaricate.
viki

Il cestino Snake (costruito sulla parte superiore del pip) scaricherà anche le dipendenze delle dipendenze.
viki

14
@vikki Non è vero, "pip install --download" scarica anche le dipendenze, quindi i comandi sopra funzioneranno correttamente anche se i tuoi requisiti hanno dipendenze aggiuntive. Il cestino del serpente può fare altre cose utili (mai usato), ma sicuramente non è necessario per questo motivo.
Carl Meyer,

6
@vikki Capisco quello che stai dicendo, ma ti sto dicendo che non è vero :-) Dovresti davvero provarlo prima di pubblicare di nuovo la stessa affermazione. Ho appena inserito "pytest" in un requisito.txt, ho eseguito "pip install --download. -R Requisiti.txt" e ha scaricato gli sdist sia per pytest che per la sua dipendenza setup.py, "py".
Carl Meyer,

3
Penso che dovrebbe essere: --find-links file:/path/to/some/dir/e dovresti scaricare e installare con la stessa versione di pip - altrimenti potrebbe non funzionare
A. Binzxxxxxx

57

Se si desidera installare offline le librerie python e le relative dipendenze, completare la seguente procedura su un computer con lo stesso sistema operativo, la stessa rete connessa e installato python:

1) Crea un requirements.txtfile con contenuti simili (Nota: queste sono le librerie che desideri scaricare):

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

Un'opzione per la creazione del file dei requisiti è l'utilizzo pip freeze > requirements.txt. Questo elencherà tutte le librerie nel tuo ambiente. Quindi puoi accedere requirements.txte rimuovere quelli non necessari.

2) Eseguire il comando mkdir wheelhouse && pip download -r requirements.txt -d wheelhouseper scaricare le librerie e le loro dipendenze nella directorywheelhouse

3) Copia requisiti.txt nella wheelhousedirectory

4) Archivio timoneria in wheelhouse.tar.gzcontar -zcf wheelhouse.tar.gz wheelhouse

Quindi carica wheelhouse.tar.gzsul tuo computer di destinazione:

1) Eseguire tar -zxf wheelhouse.tar.gzper estrarre i file

2) Eseguire pip install -r wheelhouse/requirements.txt --no-index --find-links wheelhouseper installare le librerie e le relative dipendenze


6
Questa è la risposta più chiara con i passaggi corretti per un principiante. Grazie
kumarharsh l'

Questo è il modo più pitonico che ho visto finora. Grazie!
peluzza,

2
ma seguendo le tue istruzioni, quando pip installalla fine, mi dice: ERRORE: impossibile trovare una versione che soddisfi i requisiti ..`
DennisLi

@DennisLi qual è la tua versione di Python e Pip?
Chaokunyang,

L'ho capito, questo perché pip non riesce a trovare la versione specifica del pacchetto panda nel mio requisito.txt, poiché ho usato pip3 per installare i panda 0.2
DennisLi

13

pitone offline. per fare ciò uso virtualenv (ambiente Python isolato)

1) installa virtualenv online con pip:

pip install virtualenv --user

o offline con whl: vai a questo link , scarica l'ultima versione (.whl o tar.gz) e installala con questo comando:

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

utilizzando --usernon è necessario utilizzare sudo pip….

2) usa virtualenv

sulla macchina online selezionare una directory con terminale cded eseguire questo codice:

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

dopo aver installato tutti i pacchetti, devi generare un requirements.txtcosì mentre il tuo virtualenv è attivo, scrivi

pip freeze > requirements.txt

aprire un nuovo terminale e creare un altro env come myenv2.

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

ora puoi andare alla tua cartella offline dove sono presenti la cartella requirements.txte tranferred_packages. scarica i pacchetti con il seguente codice e mettili tutti nella tranferred_packagescartella.

pip download -r requirements.txt

porta la tua cartella offline sul computer offline e poi

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

cosa c'è nella cartella offline [Requisito.txt, tranferred_packages {Flask-0.10.1.tar.gz, ...}]

controlla l'elenco del tuo pacchetto

pip list

nota: come lo siamo nel 2017 è meglio usare python 3. è possibile creare virtualenv python 3 con questo comando.

virtualenv -p python3 envname

2
Sembra che ci siano dei passaggi mancanti o "offuscati" qui, mi aspetterei di vedere un 'disattivare' e poi 'pip freeze' ... cd offline e ./tranferred_packages appare dal nulla - chiaramente questo ha bisogno di una pulizia?
Hannu,

forse, ma dovresti considerare "Volevo un breve post", "quel processo era complesso e non potevo scrivere ogni passaggio (questo è possibile solo su YouTube)".
cyera,

Questa è la migliore risposta imho. Aiutato molto
webofmars il

Questa sarebbe la risposta migliore se dicesse qualcosa su come impostare la cartella tranferred_packages. Senza passaggi cruciali, -1
Zim

8

Scarica il tarball , trasferiscilo sul tuo computer FreeBSD ed estrailo, poi corri python setup.py installe il gioco è fatto!

EDIT: solo per aggiungere a ciò, è anche possibile installare i tarball con pip ora.


1
Che dire di tutte le dipendenze? Qual è il modo migliore per risolverli? Devo installare anche le dipendenze manualmente?
Chris Drantz,

Sì, è purtroppo l'unico modo che conosco.
dav1d

8

Lasciami passare attraverso il processo passo dopo passo:

  1. Su un computer connesso a Internet, creare una cartella.
   $ mkdir packages
   $ cd packages
  1. aprire un prompt dei comandi o una shell ed eseguire il comando seguente:

    Supponiamo che il pacchetto desiderato sia tensorflow

    $ pip download tensorflow

  2. Ora, sul computer di destinazione, copia la packagescartella e applica il seguente comando

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

Si noti che tensorflow-xyz.whldeve essere sostituito dal nome originale del pacchetto richiesto.


6

Utilizzo di wheelpacchetti compilati.

impacchettare:

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

copia tarball e installa:

$ 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/*

Nota i wheelpacchetti binari non si trovano su più macchine.

Più rif. qui: https://pip.pypa.io/en/stable/user_guide/#installation-bundles


1
Ho avuto problemi con il raggruppamento sulla macchina con Python 3.6 e l'estrazione su un altro con Python 3.5: " <pacchetto> .whl non è una ruota supportata su questa piattaforma ". È possibile che le versioni di origine e destinazione corrispondano ad alcuni pacchetti.
Juuso Ohtonen,

5

Ho avuto un problema simile. E ho dovuto farlo installare allo stesso modo, lo facciamo da Pypi.

Ho fatto le seguenti cose:

  1. Creare una directory per archiviare tutti i pacchetti nel computer con accesso a Internet.

    mkdir -p /path/to/packages/
  2. Scarica tutti i pacchetti sul percorso

    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. Tar la directory dei pacchetti e copiarlo sulla macchina che non ha accesso a Internet. Quindi fa,

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

    Copia il pacchetto.tar.gz nel computer di destinazione che non ha accesso a Internet.

  4. Nella macchina che non ha accesso a Internet, procedi come segue (Supponendo di aver copiato i pacchetti tarred in / percorso / a / pacchetto / nella macchina corrente)

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

    e incolla il seguente contenuto all'interno e salvalo.

    [global]
    timeout = 10
    find-links = file:///path/to/package/
    no-cache-dir = true
    no-index = true
  5. Infine, ti suggerisco di usare una qualche forma di virtualenvinstallazione dei pacchetti.

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

Dovresti essere in grado di scaricare tutti i moduli che si trovano nella directory / percorso / in / pacchetto / .

Nota: l'ho fatto solo perché non ho potuto aggiungere opzioni o cambiare il modo in cui installiamo i moduli. Altrimenti avrei fatto

    pip install --no-index --find-links /path/to/download/dir/ -r requirements.txt

3

Per Pip 8.1.2 è possibile utilizzare pip download -r requ.txtper scaricare pacchetti sul proprio computer locale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.