2012-06-18 26 views
82

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 una scatola di FreeBSD che non è connessa a Internet.Pacchetti Python Installazione offline

+1

Correlato: [Come convogliare i pacchetti di installazione in base a requirements.txt da una directory locale?] (http://stackoverflow.com/q/7225900/95735) –

risposta

42

Se il pacchetto è su PYPI, scaricarlo e le sue dipendenze in qualche directory locale. E.g.

 
$ mkdir /pypi && cd /pypi 
$ ls -la 
    -rw-r--r-- 1 pavel staff 237954 Apr 19 11:31 Flask-WTF-0.6.tar.gz 
    -rw-r--r-- 1 pavel staff 389741 Feb 22 17:10 Jinja2-2.6.tar.gz 
    -rw-r--r-- 1 pavel staff 70305 Apr 11 00:28 MySQL-python-1.2.3.tar.gz 
    -rw-r--r-- 1 pavel staff 2597214 Apr 10 18:26 SQLAlchemy-0.7.6.tar.gz 
    -rw-r--r-- 1 pavel staff 1108056 Feb 22 17:10 Werkzeug-0.8.2.tar.gz 
    -rw-r--r-- 1 pavel staff 488207 Apr 10 18:26 boto-2.3.0.tar.gz 
    -rw-r--r-- 1 pavel staff 490192 Apr 16 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.py avrà l'elenco install_requires che menziona una o più cose nella directory /pypi. In questo modo:

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

Se si vuole essere in grado di eseguire l'applicazione con tutte le dipendenze necessarie, mentre ancora l'hacking su di esso, farete qualcosa di simile:

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

In questo modo la vostra applicazione verrà eseguito direttamente dalla directory di origine. Puoi modificare le cose e quindi rieseguire l'app senza ricostruire nulla.

Se si desidera installare la vostra applicazione e le sue dipendenze nell'ambiente pitone corrente, farete qualcosa di simile:

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

In entrambi i casi, la costruzione fallirà se una o più dipendenze aren' t presente nella directory /pypi. Non tenterà di installare promiscuamente cose mancanti da Internet.

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

Se la macchina che hai costruito la tua app ha la stessa architettura della macchina su cui vuoi distribuirla, puoi semplicemente tarballare l'intera directory di ambiente virtuale in cui ti trovi easy_install -ed tutto. Tuttavia, prima di tarballing, è necessario rendere rilocabile la directory dell'ambiente virtuale (vedere l'opzione --relocatable). NOTA: la macchina di destinazione deve avere la stessa versione di Python installata, e anche tutte le dipendenze basate su C che la tua app può avere deve essere preinstallata anche lì (ad esempio, se dipendi da PIL, quindi libpng, libjpeg, ecc. pre installato).

+2

Invece di '--allow-hosts = None' puoi usare lo switch' --no-index' – romor

+0

Puoi per favore elaborare come creare un'applicazione Python opportunamente formata? –

+2

@PrabhjotRai si prega di fare riferimento a https://packaging.python.org/distributing/ –

4

Scaricare il tarball, trasferirlo sul computer FreeBSD ed estrarlo, quindi eseguire python setup.py install e il gioco è fatto!

MODIFICA: Solo per aggiungere che, è anche possibile installare i tarball con pip ora.

+1

Che dire di tutte le dipendenze? Qual è il modo migliore per risolverli? Devo anche installare manualmente le dipendenze? –

+0

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

157

si utilizza l'opzione -d (o --download) per pip install, il che rende il processo di download tarball sdist da PyPI molto più semplice.Ad esempio, pip install --download /path/to/some/dir celery scaricherà i tarball sdist per il sedano e tutte le sue dipendenze su /path/to/some/dir (ma non li installerà). Quindi è possibile utilizzare pip install --no-index --find-links /path/to/some/dir/ celery per installare il sedano utilizzando gli sdist scaricati, senza accedere alla rete.

Lo stesso processo funziona se si sostituisce celery in entrambi i comandi con -r requirements.txt, dove requirements.txt è un file di requisiti pip che elenca tutti i pacchetti che si desidera (e facoltativamente le versioni che si desidera).

UPDATE

deprecazione: pip install --download è stato deprecato e sarà rimosso in futuro. Pip ora ha un comando download che dovrebbe essere usato come .

Il comando è come questo:
pip download -r requirements.txt

Per python3:
pip3 download -r requirements.txt

+0

problema con questo è che le dipendenze potrebbero avere altre dipendenze e quelli non saranno scaricati. – vikki

+0

[Cestino serpente] (https://github.com/prezi/snakebasket) (costruito in cima al pip) scaricherà anche le dipendenze delle dipendenze. – vikki

+4

@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 non è assolutamente necessario per questo motivo. –

2

per Pip 8.1.2 è possibile utilizzare pip download -r requ.txt per scaricare i pacchetti sul computer locale.

2

python offline. per fare questo io uso virtualenv (isolato ambiente Python)

1) installare virtualenv online con pip:

pip install virtualenv --user 

o non in linea con WHL: andare a questo link, scaricare l'ultima versione (.whl o tar. gz) e l'installazione che con questo comando:

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

utilizzando --user non è necessario utilizzare sudo pip….

2) utilizzare virtualenv

su machine online selezionare una directory con terminale cd ed eseguire questo codice:

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

dopo l'installazione di tutti i pacchetti, è necessario generare un requirements.txt così mentre il vostro virtualenv è attivo, scrivere

pip freeze > requirements.txt 

aprire un nuovo terminale e creare un'altra env come myenv2.

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

ora si può andare alla vostra cartella non in linea in cui la cartella requirements.txt e tranferred_packages sono in là. scarica i pacchetti con il seguente codice e mettili tutti nella cartella tranferred_packages.

pip download -r requirements.txt 

prendere la cartella non in linea di computer non in linea e quindi

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

ciò che è nella linea cartella [requirements.txt, tranferred_packages {Flask-0.10.1.tar.gz, ...} ] elenco

controllo del vostro pacchetto

pip list 

nota: come siamo nel 2017 è meglio usare Python 3. yo puoi creare python 3 virtualenv con questo comando.

virtualenv -p python3 envname 
+0

Qui sembra mancare o "offuscare" i passi, mi aspetto di vedere un 'disattivare' e quindi 'bloccare i pip' ... cd offline e ./tranferred_packages appare dal nulla - chiaramente questo ha bisogno di una pulizia? – Hannu

+0

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

2

Utilizzo di pacchetti compilati wheel.

fascio up:

$ 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 ed installare:

$ 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 wheel pacchetti binari non sono tra macchine.

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

+1

Ho riscontrato problemi con il bundle sulla macchina con Python 3.6 e l'estrazione su un altro con Python 3.5: "_ .whl non è una ruota supportata su questa piattaforma_". Le versioni di origine e destinazione potrebbero essere richieste per corrispondere con alcuni pacchetti. –

Problemi correlati