Bagaimana cara menginstal paket secara offline?

160

Apa cara terbaik untuk mengunduh paket python dan dependensinya dari pypi untuk instalasi offline di komputer lain? Apakah ada cara mudah untuk melakukan ini dengan pip atau easy_install? Saya mencoba menginstal pustaka permintaan pada kotak FreeBSD yang tidak terhubung ke internet.

Chris Drantz
sumber

Jawaban:

77

Jika paket tersebut ada di PYPI, unduh dan ketergantungannya ke beberapa direktori lokal. Misalnya

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

Beberapa paket mungkin harus diarsipkan ke dalam tarbal tampak serupa dengan tangan. Saya sering melakukannya ketika saya menginginkan versi yang lebih baru (kurang stabil) dari sesuatu. Beberapa paket tidak pada PYPI, jadi hal yang sama berlaku untuk mereka.

Misalkan Anda memiliki aplikasi Python yang terbentuk dengan benar di ~/src/myapp. ~/src/myapp/setup.pyakan memiliki install_requiresdaftar yang menyebutkan satu atau lebih hal yang Anda miliki di /pypidirektori Anda . Seperti itu:

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

Jika Anda ingin dapat menjalankan aplikasi Anda dengan semua dependensi yang diperlukan saat masih meretasnya, Anda akan melakukan sesuatu seperti ini:

$ cd ~ / src / myapp
$ python setup.py mengembangkan --always-unzip --allow-hosts = Tidak ada --find-links = / pypi

Dengan cara ini aplikasi Anda akan dieksekusi langsung dari direktori sumber Anda. Anda dapat meretas sesuatu, dan kemudian menjalankan kembali aplikasi tanpa membangun kembali apa pun.

Jika Anda ingin menginstal aplikasi dan dependensinya ke dalam lingkungan python saat ini, Anda akan melakukan sesuatu seperti ini:

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

Dalam kedua kasus, build akan gagal jika satu atau lebih dependensi tidak ada dalam /pypidirektori. Itu tidak akan mencoba untuk secara sembarangan menginstal hal-hal yang hilang dari Internet.

Saya sangat merekomendasikan untuk memanggil setup.py develop ...dan easy_install ...dalam lingkungan virtual aktif untuk menghindari kontaminasi lingkungan Python global Anda. Ini (virtualenv) cukup banyak cara untuk pergi. Jangan pernah memasang apa pun ke lingkungan Python global.

Jika mesin yang Anda buat aplikasi Anda memiliki arsitektur yang sama dengan mesin yang ingin Anda gunakan, Anda bisa langsung memasukkan seluruh direktori lingkungan virtual ke mana Anda easy_installmenambahkan semuanya. Tepat sebelum tarballing, Anda harus membuat direktori lingkungan virtual dapat dipindahkan (lihat opsi --relocatable ). CATATAN: mesin tujuan harus memiliki versi Python yang sama diinstal, dan juga setiap dependensi berbasis C aplikasi Anda mungkin harus sudah diinstal di sana juga (misalnya mengatakan jika Anda bergantung pada PIL , maka libpng, libjpeg, dll harus diinstal sebelumnya) .

Pavel Repin
sumber
3
Alih-alih --allow-hosts=NoneAnda bisa menggunakan saklar--no-index
romor
Bisakah Anda menguraikan cara membuat aplikasi Python yang terbentuk dengan benar?
psr
3
@PrabhjotRai silakan merujuk ke packaging.python.org/distributing
Pavel Repin
300

downloadPerintah pip memungkinkan Anda mengunduh paket tanpa menginstalnya:

pip download -r requirements.txt

(Dalam versi pip sebelumnya, ini dieja pip install --download -r requirements.txt.)

Kemudian Anda dapat menggunakan pip install --no-index --find-links /path/to/download/dir/ -r requirements.txtuntuk menginstal sdists yang diunduh itu, tanpa mengakses jaringan.

Carl Meyer
sumber
masalah dengan ini adalah bahwa dependensi mungkin memiliki dependensi lain dan mereka tidak akan diunduh.
vikki
Keranjang ular (dibangun di atas pip) akan mengunduh dependensi dependensi juga.
vikki
14
@vikki Tidak benar, "pip install --download" juga mengunduh dependensi, jadi perintah di atas akan berfungsi dengan benar bahkan jika persyaratan Anda memiliki dependensi tambahan. Keranjang ular dapat melakukan hal-hal bermanfaat lainnya (tidak pernah digunakan), tetapi pasti tidak diperlukan karena alasan itu.
Carl Meyer
6
@vikki Saya mengerti apa yang Anda katakan, tetapi saya mengatakan kepada Anda bahwa itu tidak benar :-) Anda harus benar-benar mencobanya sebelum Anda memposting pernyataan yang sama lagi. Saya baru saja meletakkan "pytest" di requirement.txt, jalankan "pip install --download. -R requirement.txt", dan ia mengunduh sdists untuk pytest dan dependensinya setup.py, "py".
Carl Meyer
3
Saya pikir itu harus: --find-links file:/path/to/some/dir/dan Anda harus mengunduh dan menginstal dengan versi yang sama dari pip - jika tidak maka akan gagal
A. Binzxxxxxx
57

Jika Anda ingin menginstal python libs dan dependensinya offline, selesaikan langkah-langkah berikut pada mesin dengan os yang sama, jaringan terhubung, dan python diinstal:

1) Buat requirements.txtfile dengan konten serupa (Catatan - ini adalah perpustakaan yang ingin Anda unduh):

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

Salah satu opsi untuk membuat file persyaratan adalah menggunakan pip freeze > requirements.txt. Ini akan mencantumkan semua perpustakaan di lingkungan Anda. Kemudian Anda bisa masuk ke requirements.txtdan menghapus yang tidak diperlukan.

2) Jalankan perintah mkdir wheelhouse && pip download -r requirements.txt -d wheelhouseuntuk mengunduh lib dan dependensinya ke direktoriwheelhouse

3) Salin persyaratan.txt ke wheelhousedirektori

4) Arsip ruang kemudi ke wheelhouse.tar.gzdengantar -zcf wheelhouse.tar.gz wheelhouse

Kemudian unggah wheelhouse.tar.gzke mesin target Anda:

1) Jalankan tar -zxf wheelhouse.tar.gzuntuk mengekstrak file

2) Jalankan pip install -r wheelhouse/requirements.txt --no-index --find-links wheelhouseuntuk menginstal lib dan dependensinya

chaokunyang
sumber
6
Ini adalah jawaban yang paling jelas dengan langkah-langkah yang tepat untuk pemula. Terima kasih
kumarharsh
Ini adalah cara paling pythonic yang pernah saya lihat sejauh ini. Terima kasih!
peluzza
2
tetapi mengikuti instruksi Anda, ketika saya pip installpada akhirnya, ia mengatakan: ERROR: tidak dapat menemukan versi yang memenuhi persyaratan ..`
DennisLi
@ Dennisli apa versi python dan pip Anda?
chaokunyang
Saya menemukan ini, itu karena pip tidak dapat menemukan versi spesifik dari paket panda di requirement.txt saya, karena saya menggunakan pip3 untuk menginstal panda 0.2
DennisLi
13

python offline. untuk melakukan ini saya menggunakan virtualenv (lingkungan Python terisolasi)

1) instal virtualenv online dengan pip:

pip install virtualenv --user

atau offline dengan whl: buka tautan ini , unduh versi terakhir (.whl atau tar.gz) dan instal dengan perintah ini:

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

dengan menggunakan --userAnda tidak perlu menggunakan sudo pip….

2) gunakan virtualenv

pada mesin online pilih direktori dengan terminal cddan jalankan kode ini:

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

Setelah menginstal semua paket, Anda harus membuat requirements.txtjadi sementara virtualenv Anda aktif, tulis

pip freeze > requirements.txt

buka terminal baru dan buat env lain seperti myenv2.

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

sekarang Anda dapat pergi ke folder offline di mana folder requirements.txtdan Anda tranferred_packagesada di sana. unduh paket dengan kode berikut dan masukkan semuanya ke tranferred_packagesfolder.

pip download -r requirements.txt

bawa folder offline Anda ke komputer offline lalu

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

apa yang ada di folder offline [requirement.txt, tranferred_packages {Flask-0.10.1.tar.gz, ...}]

periksa daftar paket Anda

pip list

Catatan: seperti kita di tahun 2017 lebih baik menggunakan python 3. Anda dapat membuat python 3 virtualenv dengan perintah ini.

virtualenv -p python3 envname
cyera
sumber
2
Tampaknya ada langkah-langkah yang hilang atau "dikaburkan" di sini, saya akan berharap untuk melihat 'menonaktifkan' dan kemudian 'membekukan pipa' ... cd offline dan ./tranferred_packages muncul entah dari mana - jelas ini membutuhkan pembersihan?
Hannu
mungkin, tetapi Anda harus mempertimbangkan 'Saya ingin posting singkat', 'proses itu rumit dan saya tidak bisa menulis setiap langkah (yang hanya mungkin di YouTube)'.
cyera
Ini jawaban yang terbaik. Banyak membantu
webofmars
Ini akan menjadi jawaban terbaik jika ia mengatakan sesuatu tentang cara mengatur folder tranferred_packages. Tanpa langkah-langkah penting, -1
Zim
8

Unduh tarball , transfer ke mesin FreeBSD Anda dan ekstrak, setelah itu jalankan python setup.py installdan Anda selesai!

Sunting: Hanya untuk menambahkan itu, Anda juga dapat menginstal tarbal dengan pip sekarang.

dav1d
sumber
1
Bagaimana dengan semua dependensi? Apa cara terbaik untuk mengatasinya? Apakah saya perlu menginstal dependensi secara manual juga?
Chris Drantz
Ya, itu satu-satunya cara yang saya tahu.
dav1d
8

Biarkan saya melalui proses langkah demi langkah:

  1. Di komputer yang terhubung ke internet, buat folder.
   $ mkdir packages
   $ cd packages
  1. buka prompt perintah atau shell dan jalankan perintah berikut:

    Misalkan paket yang Anda inginkan adalah tensorflow

    $ pip download tensorflow

  2. Sekarang, di komputer target, salin packagesfolder dan terapkan perintah berikut

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

Perhatikan bahwa tensorflow-xyz.whlharus diganti dengan nama asli paket yang diperlukan.

arunanshub
sumber
6

Menggunakan wheelpaket yang dikompilasi.

bundel:

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

salin tarball dan instal:

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

Catatan wheelpaket biner tidak lintas mesin.

Lebih banyak referensi. di sini: https://pip.pypa.io/en/stable/user_guide/#installation-bundles

eshizhan
sumber
1
Saya memiliki masalah dengan bundling pada mesin dengan Python 3.6 dan mengekstraksi yang lain dengan Python 3.5: " <package> .whl bukan roda yang didukung pada platform ini ". Versi sumber dan tujuan mungkin diperlukan untuk dicocokkan dengan beberapa paket.
Juuso Ohtonen
5

Saya punya masalah serupa. Dan saya harus membuatnya menginstal dengan cara yang sama, kami lakukan dari pypi.

Saya melakukan hal-hal berikut:

  1. Buat direktori untuk menyimpan semua paket di mesin yang memiliki akses internet.

    mkdir -p /path/to/packages/
  2. Unduh semua paket ke jalur

    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 direktori direktori dan salin ke Mesin yang tidak memiliki akses internet. Lalu lakukan,

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

    Salin paket.tar.gz ke mesin tujuan yang tidak memiliki akses internet.

  4. Di mesin yang tidak memiliki akses internet, lakukan hal berikut (Dengan asumsi Anda menyalin paket tar ke / path / ke / paket / di mesin saat ini)

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

    dan rekatkan konten berikut di dalam dan simpan.

    [global]
    timeout = 10
    find-links = file:///path/to/package/
    no-cache-dir = true
    no-index = true
  5. Akhirnya, saya sarankan Anda menggunakan, beberapa bentuk virtualenvuntuk menginstal paket.

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

Anda harus dapat mengunduh semua modul yang ada di direktori / path / ke / paket / .

Catatan: Saya hanya melakukan ini, karena saya tidak bisa menambahkan opsi atau mengubah cara kami menginstal modul. Kalau tidak, aku akan melakukannya

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

Untuk Pip 8.1.2 Anda dapat menggunakan pip download -r requ.txtuntuk mengunduh paket ke mesin lokal Anda.

Umut Gunebakan
sumber