Jak zainstalować pakiety offline?

159

Jaki jest najlepszy sposób na pobranie pakietu Pythona i jego zależności z pypi w celu instalacji offline na innym komputerze? Czy jest jakiś łatwy sposób na zrobienie tego za pomocą pip lub easy_install? Próbuję zainstalować bibliotekę żądań na komputerze z FreeBSD, który nie jest połączony z Internetem.

Chris Drantz
źródło

Odpowiedzi:

77

Jeśli pakiet znajduje się w PYPI, pobierz go i jego zależności do jakiegoś lokalnego katalogu. Na przykład

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

Niektóre pakiety mogą wymagać ręcznego archiwizowania w podobnie wyglądających paczkach. Robię to często, gdy chcę mieć nowszą (mniej stabilną) wersję czegoś. Niektórych pakietów nie ma w PYPI, więc to samo dotyczy ich.

Załóżmy, że masz poprawnie utworzoną aplikację w języku Python w ~/src/myapp. ~/src/myapp/setup.pybędzie mieć install_requireslistę, która wymienia jedną lub więcej rzeczy, które masz w swoim /pypikatalogu. Tak jak to:

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

Jeśli chcesz mieć możliwość uruchamiania aplikacji ze wszystkimi niezbędnymi zależnościami, a jednocześnie nadal ją hakujesz, zrobisz coś takiego:

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

W ten sposób Twoja aplikacja zostanie wykonana bezpośrednio z katalogu źródłowego. Możesz włamać się do rzeczy, a następnie ponownie uruchomić aplikację bez odbudowywania czegokolwiek.

Jeśli chcesz zainstalować swoją aplikację i jej zależności w obecnym środowisku Pythona, zrobisz coś takiego:

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

W obu przypadkach kompilacja zakończy się niepowodzeniem, jeśli w /pypikatalogu nie ma co najmniej jednej zależności . Nie będzie próbować swobodnie instalować brakujących rzeczy z Internetu.

Gorąco polecam do powoływania setup.py develop ...i easy_install ...wewnątrz aktywnym środowisku wirtualnym , aby uniknąć zanieczyszczenia środowiska globalnego Pythona. Jest to (to znaczy virtualenv) droga do zrobienia. Nigdy nie instaluj niczego w globalnym środowisku Pythona.

Jeśli maszyna, na której zbudowałeś swoją aplikację, ma taką samą architekturę jak maszyna, na której chcesz ją wdrożyć, możesz po prostu złożyć w archiwum cały katalog środowiska wirtualnego, w którym easy_installwszystko zostało umieszczone. Jednak tuż przed utworzeniem archiwum tarballu należy umożliwić relokację katalogu środowiska wirtualnego (zobacz opcję --relocatable ). UWAGA: maszyna docelowa musi mieć zainstalowaną tę samą wersję Pythona, a także wszelkie zależności oparte na języku C, które może mieć Twoja aplikacja, również muszą być tam wstępnie zainstalowane (np. Jeśli jesteś zależny od PIL , to libpng, libjpeg itp. Muszą być wstępnie zainstalowane) .

Pavel Repin
źródło
3
Zamiast --allow-hosts=Noneciebie mógłbyś użyć przełącznika--no-index
romor
Czy możesz wyjaśnić, jak utworzyć poprawnie uformowaną aplikację w języku Python?
psr
3
@PrabhjotRai patrz packaging.python.org/distributing
Pavel Repin
299

Polecenie pip downloadumożliwia pobieranie pakietów bez ich instalowania:

pip download -r requirements.txt

(W poprzednich wersjach pip było to pisane pip install --download -r requirements.txt).

Następnie możesz użyć pip install --no-index --find-links /path/to/download/dir/ -r requirements.txtdo zainstalowania pobranych list sdists bez dostępu do sieci.

Carl Meyer
źródło
Problem polega na tym, że zależności mogą mieć inne zależności, które nie zostaną pobrane.
Vikki
Snake basket (zbudowany na bazie pip) pobierze również zależności zależności.
vikki
14
@vikki Nie prawda, „pip install --download” również pobiera zależności, więc powyższe polecenia będą działać poprawnie, nawet jeśli Twoje wymagania mają dodatkowe zależności. Kosz węża może robić inne przydatne rzeczy (nigdy go nie używał), ale zdecydowanie nie jest potrzebny z tego powodu.
Carl Meyer
6
@vikki Rozumiem, co mówisz, ale mówię ci, że to nieprawda :-) Powinieneś spróbować, zanim ponownie opublikujesz to samo twierdzenie. Po prostu wstawiłem „pytest” do pliku Requirements.txt, uruchomiłem „pip install --download. -R Requirements.txt” i pobrałem pliki sdists zarówno dla pytest, jak i dla jego zależności setup.py, „py”.
Carl Meyer
3
Myślę, że powinno być: --find-links file:/path/to/some/dir/i powinieneś pobrać i zainstalować z tą samą wersją pip - w przeciwnym razie może się nie powieść
A. Binzxxxxxx
56

Jeśli chcesz zainstalować biblioteki Python i ich zależności w trybie offline, zakończ następujące kroki na komputerze z tym samym systemem operacyjnym, podłączoną siecią i zainstalowanym językiem Python:

1) Utwórz requirements.txtplik o podobnej zawartości (Uwaga - są to biblioteki, które chcesz pobrać):

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

Jedną z opcji tworzenia pliku wymagań jest użycie pip freeze > requirements.txt. Spowoduje to wyświetlenie wszystkich bibliotek w twoim środowisku. Następnie możesz wejść requirements.txti usunąć niepotrzebne.

2) Wykonaj polecenie, mkdir wheelhouse && pip download -r requirements.txt -d wheelhouseaby pobrać biblioteki i ich zależności do kataloguwheelhouse

3) Skopiuj wymagania.txt do wheelhousekatalogu

4) Zarchiwizuj sterówkę do wheelhouse.tar.gzztar -zcf wheelhouse.tar.gz wheelhouse

Następnie prześlij wheelhouse.tar.gzna komputer docelowy:

1) Wykonaj, tar -zxf wheelhouse.tar.gzaby wyodrębnić pliki

2) Uruchom, pip install -r wheelhouse/requirements.txt --no-index --find-links wheelhouseaby zainstalować biblioteki i ich zależności

chaokunyang
źródło
6
To najjaśniejsza odpowiedź z odpowiednimi krokami dla początkującego. Dzięki
kumarharsh
To najbardziej pytoniczny sposób, jaki do tej pory widziałem. Dzięki!
peluzza
2
ale zgodnie z twoją instrukcją, kiedy pip installw końcu mówi: BŁĄD: nie mogłem znaleźć wersji, która spełnia wymagania .. "
DennisLi
@DennisLi jaka jest twoja wersja Pythona i PIP?
chaokunyang
Rozgryzłem to, ponieważ pip nie może znaleźć konkretnej wersji pakietu pand w moim pliku Requirements.txt, ponieważ użyłem pip3 do zainstalowania pand 0.2
DennisLi
13

Python offline. do tego używam virtualenv (izolowane środowisko Pythona)

1) Zainstaluj virtualenv online za pomocą pip:

pip install virtualenv --user

lub offline za pomocą whl: przejdź do tego linku , pobierz ostatnią wersję (.whl lub tar.gz) i zainstaluj ją za pomocą tego polecenia:

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

używając --user, nie musisz używać sudo pip….

2) użyj virtualenv

na maszynie online wybierz katalog z terminalem cdi uruchom ten kod:

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

po zainstalowaniu wszystkich pakietów, musisz wygenerować, requirements.txtwięc gdy twój virtualenv jest aktywny, napisz

pip freeze > requirements.txt

otwórz nowy terminal i utwórz kolejny podobny do env myenv2.

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

teraz możesz przejść do folderu offline, w którym znajduje się Twój folder requirements.txti tranferred_packages. pobierz pakiety z następującym kodem i umieść je wszystkie w tranferred_packagesfolderze.

pip download -r requirements.txt

przenieś folder offline na komputer offline, a następnie

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

co jest w folderze offline [Requirements.txt, tranferred_packages {Flask-0.10.1.tar.gz, ...}]

lista kontrolna twojego pakietu

pip list

uwaga: tak jak w 2017 roku lepiej jest używać pythona 3. tym poleceniem można stworzyć python 3 virtualenv.

virtualenv -p python3 envname
cyera
źródło
2
Wygląda na to, że brakuje kroków lub są „zaciemnione”, spodziewałbym się zobaczyć „dezaktywację”, a następnie „pip freeze” ... cd offline i znikąd pojawia się ./tranferred_packages - najwyraźniej wymaga to uporządkowania?
Hannu,
może, ale powinieneś rozważyć „Chciałem krótki post”, „ten proces był złożony i nie mogłem napisać każdego kroku (to możliwe tylko w YouTube)”.
cyera
To najlepsza odpowiedź imho. Bardzo
pomogło
To byłaby najlepsza odpowiedź, gdyby w ogóle mówiła o tym, jak skonfigurować folder tranferred_packages. Bez kluczowych kroków, -1
Zim
8

Pobierz archiwum , prześlij je na swój komputer z FreeBSD i wypakuj, a następnie uruchom python setup.py installi gotowe!

EDYCJA: Żeby to dodać, możesz teraz zainstalować paczki z pip.

dav1d
źródło
1
A co ze wszystkimi zależnościami? Jaki jest najlepszy sposób ich rozwiązania? Czy muszę również ręcznie instalować zależności?
Chris Drantz
Tak, niestety to jedyny sposób, jaki znam.
dav1d
8

Pozwól, że przejdę przez proces krok po kroku:

  1. Na komputerze połączonym z Internetem utwórz folder.
   $ mkdir packages
   $ cd packages
  1. otwórz wiersz polecenia lub powłokę i wykonaj następujące polecenie:

    Załóżmy, że żądany pakiet to tensorflow

    $ pip download tensorflow

  2. Teraz na komputerze docelowym skopiuj packagesfolder i zastosuj następujące polecenie

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

Należy pamiętać, że tensorflow-xyz.whlnależy zastąpić oryginalną nazwę wymaganego pakietu.

arunanshub
źródło
6

Używanie wheelskompilowanych pakietów.

zbierać:

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

skopiuj archiwum i zainstaluj:

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

Uwaga: wheelpakiety binarne nie znajdują się na różnych maszynach.

Więcej ref. tutaj: https://pip.pypa.io/en/stable/user_guide/#installation-bundles

eshizhan
źródło
1
Miałem problemy z pakowaniem na komputerze z Pythonem 3.6 i wypakowywaniem na innym z Pythonem 3.5: „ <package> .whl nie jest obsługiwanym kołem na tej platformie ”. Niektóre pakiety mogą wymagać zgodności wersji źródłowej i docelowej.
Juuso Ohtonen
5

Miałem podobny problem. Musiałem zainstalować go w ten sam sposób, co robimy z pypi.

Zrobiłem następujące rzeczy:

  1. Utwórz katalog do przechowywania wszystkich pakietów na komputerze, które mają dostęp do Internetu.

    mkdir -p /path/to/packages/
  2. Pobierz wszystkie pakiety do ścieżki

    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. Taruj katalog z pakietami i skopiuj go do Maszyny, która nie ma dostępu do Internetu. Następnie zrób

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

    Skopiuj packages.tar.gz na komputer docelowy, który nie ma dostępu do Internetu.

  4. Na komputerze, który nie ma dostępu do Internetu, wykonaj następujące czynności (zakładając, że skopiowałeś tarowane pakiety do / path / to / package / w bieżącej maszynie)

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

    i wklej następującą zawartość do środka i zapisz ją.

    [global]
    timeout = 10
    find-links = file:///path/to/package/
    no-cache-dir = true
    no-index = true
  5. Na koniec sugeruję użycie jakiejś formy virtualenvdo instalacji pakietów.

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

Powinieneś móc pobrać wszystkie moduły, które znajdują się w katalogu / ścieżka / do / pakiet / .

Uwaga: zrobiłem to tylko dlatego, że nie mogłem dodać opcji ani zmienić sposobu instalowania modułów. W przeciwnym razie zrobiłbym to

    pip install --no-index --find-links /path/to/download/dir/ -r requirements.txt
han solo
źródło
3

W przypadku Pip 8.1.2 możesz pip download -r requ.txtpobrać pakiety na komputer lokalny.

Umut Gunebakan
źródło