Làm thế nào để cài đặt gói ngoại tuyến?


159

Cách tốt nhất để tải xuống gói python và đó là phụ thuộc từ pypi để cài đặt ngoại tuyến trên máy khác? Có cách nào dễ dàng để làm điều này với pip hoặc easy_install không? Tôi đang cố gắng cài đặt thư viện yêu cầu trên hộp FreeBSD không được kết nối với internet.


Câu trả lời:


77

Nếu gói trên PYPI, hãy tải xuống và phụ thuộc vào một số thư mục cục bộ. Ví dụ

$ mkdir / pypi && cd / pypi
$ ls -la
  -rw-r - r-- 1 nhân viên pavel 237954 19 tháng 4 11:31 Flask-WTF-0.6.tar.gz
  -rw-r - r-- 1 nhân viên pavel 389741 22 tháng 2 17:10 Jinja2-2.6.tar.gz
  -rw-r - r-- 1 nhân viên pavel 70305 ngày 11 tháng 4 00:28 MySQL-python-1.2.3.tar.gz
  -rw-r - r-- 1 nhân viên pavel 2597214 ngày 10 tháng 4 lúc 18 giờ 26 phút SQLAlchemy-0.7.6.tar.gz
  -rw-r - r-- 1 nhân viên pavel 1108056 22 tháng 2 17:10 Werkzeug-0.8.2.tar.gz
  -rw-r - r-- 1 nhân viên pavel 488207 ngày 10 tháng 4 lúc 18 giờ 26 phút boto-2.3.0.tar.gz
  -rw-r - r-- 1 pavel staff 490192 16 tháng 4 12:00 12:00-0.9-dev-2a6c80a.tar.gz

Một số gói có thể phải được lưu trữ thành tarball trông tương tự bằng tay. Tôi làm điều đó rất nhiều khi tôi muốn một phiên bản mới hơn (kém ổn định hơn) của một cái gì đó. Một số gói không có trên PYPI, vì vậy cũng áp dụng cho chúng.

Giả sử bạn có một ứng dụng Python được hình thành đúng cách ~/src/myapp. ~/src/myapp/setup.pysẽ có install_requiresdanh sách đề cập đến một hoặc nhiều thứ mà bạn có trong /pypithư mục của mình . Thích như vậy:

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

Nếu bạn muốn có thể chạy ứng dụng của mình với tất cả các phụ thuộc cần thiết trong khi vẫn hack nó, bạn sẽ làm một cái gì đó như thế này:

$ cd ~ / src / myapp
$ python setup.py phát triển --always-unzip --allow-hosts = Không --find-links = / pypi

Bằng cách này, ứng dụng của bạn sẽ được thực thi trực tiếp từ thư mục nguồn của bạn. Bạn có thể hack mọi thứ, và sau đó chạy lại ứng dụng mà không cần xây dựng lại bất cứ thứ gì.

Nếu bạn muốn cài đặt ứng dụng của mình và các phụ thuộc của nó vào môi trường python hiện tại, bạn sẽ làm một cái gì đó như thế này:

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

Trong cả hai trường hợp, bản dựng sẽ thất bại nếu một hoặc nhiều phụ thuộc không có trong /pypithư mục. Nó sẽ không cố gắng cài đặt bừa bãi những thứ còn thiếu từ Internet.

Tôi đặc biệt khuyên bạn nên gọi setup.py develop ...easy_install ...trong một môi trường ảo đang hoạt động để tránh làm ô nhiễm môi trường Python toàn cầu của bạn. Đó là (virtualenv đó) khá nhiều cách để đi. Không bao giờ cài đặt bất cứ thứ gì vào môi trường Python toàn cầu.

Nếu máy bạn đã xây dựng ứng dụng của mình có kiến ​​trúc giống như máy bạn muốn triển khai trên đó, bạn có thể chỉ cần tarball toàn bộ thư mục môi trường ảo mà bạn đã nhập easy_installmọi thứ. Ngay trước khi tarballing, bạn phải làm cho thư mục môi trường ảo có thể định vị lại được (xem tùy chọn - tương đối ). LƯU Ý: máy đích cần phải cài đặt cùng một phiên bản Python và bất kỳ phụ thuộc dựa trên C nào, ứng dụng của bạn cũng có thể phải được cài đặt sẵn ở đó (ví dụ: nếu bạn phụ thuộc vào PIL , thì phải cài đặt sẵn libpng, libjpeg, v.v.) .


3
Thay vì --allow-hosts=Nonebạn có thể sử dụng công tắc--no-index
lãng mạn

Bạn có thể giải thích cách tạo một ứng dụng Python được định dạng đúng không?
psr

3
@PrabhjotRai vui lòng tham khảo cách đóng gói
Pavel Repin

299

Lệnh pip downloadcho phép bạn tải xuống các gói mà không cần cài đặt chúng:

pip download -r requirements.txt

(Trong các phiên bản trước của pip, điều này đã được đánh vần pip install --download -r requirements.txt.)

Sau đó, bạn có thể sử dụng pip install --no-index --find-links /path/to/download/dir/ -r requirements.txtđể cài đặt các sdists đã tải xuống mà không cần truy cập mạng.


vấn đề với điều này là các phụ thuộc có thể có các phụ thuộc khác và chúng không được tải xuống.
vikki

Giỏ rắn (được xây dựng trên đỉnh pip) cũng sẽ tải xuống các phụ thuộc của phụ thuộc.
vikki

14
@vikki Không đúng, "cài đặt pip - tải xuống" cũng tải xuống các phụ thuộc, vì vậy các lệnh trên sẽ hoạt động chính xác ngay cả khi các yêu cầu của bạn có phụ thuộc bổ sung. Giỏ rắn có thể làm những việc hữu ích khác (không bao giờ sử dụng nó), nhưng nó chắc chắn không cần thiết cho lý do đó.
Carl Meyer

6
@vikki Tôi hiểu những gì bạn đang nói, nhưng tôi nói với bạn rằng điều đó không đúng :-) Bạn thực sự nên đi thử trước khi đăng lại khẳng định tương tự. Tôi chỉ đặt "pytest" trong một tệp yêu cầu, chạy "cài đặt pip - tải xuống.
Carl Meyer

3
Tôi nghĩ rằng nó nên: --find-links file:/path/to/some/dir/và bạn nên tải xuống và cài đặt với cùng một phiên bản pip - nếu không nó có thể thất bại
A. Binzxxxxxx

56

Nếu bạn muốn cài đặt lib python và các phụ thuộc của chúng ngoại tuyến, hãy hoàn tất các bước sau trên một máy có cùng hệ điều hành, mạng được kết nối và python được cài đặt:

1) Tạo một requirements.txt tệp có nội dung tương tự (Lưu ý - đây là các thư viện bạn muốn tải xuống):

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

Một tùy chọn để tạo tệp yêu cầu là sử dụng pip freeze > requirements.txt. Điều này sẽ liệt kê tất cả các thư viện trong môi trường của bạn. Sau đó, bạn có thể đi vào requirements.txtvà loại bỏ những thứ không cần thiết.

2) Thực thi lệnh mkdir wheelhouse && pip download -r requirements.txt -d wheelhouseđể tải libs và phần phụ thuộc của chúng vào thư mụcwheelhouse

3) Sao chép yêu cầu.txt vào wheelhouse thư mục

4) Lưu trữ xe lăn vào wheelhouse.tar.gz vớitar -zcf wheelhouse.tar.gz wheelhouse

Sau đó tải lên wheelhouse.tar.gz máy mục tiêu của bạn:

1) Thực thi tar -zxf wheelhouse.tar.gz để giải nén các tập tin

2) Thực thi pip install -r wheelhouse/requirements.txt --no-index --find-links wheelhouseđể cài đặt lib và phụ thuộc của chúng


6
Đây là câu trả lời rõ ràng nhất với các bước thích hợp cho người mới bắt đầu. Cảm ơn
kumarharsh

Đây là cách pythonic nhất mà tôi đã thấy cho đến nay. Cảm ơn!
peluzza

2
nhưng theo hướng dẫn của bạn, khi tôi pip installkết thúc, nó nói: LRI: không thể tìm thấy phiên bản thỏa mãn yêu cầu ..`
DennisLi

@DennisLi phiên bản python và pip của bạn là gì?
chaokunyang

Tôi đã hiểu điều này, đó là bởi vì pip không thể tìm thấy phiên bản cụ thể của gói gấu trúc trong yêu cầu của tôi, vì tôi đã sử dụng pip3 để cài đặt gấu trúc 0.2
DennisLi

13

trăn ngoại tuyến. để làm điều này, tôi sử dụng virtualenv (môi trường Python bị cô lập)

1) cài đặt virtualenv trực tuyến với pip:

pip install virtualenv --user

hoặc ngoại tuyến với whl: truy cập liên kết này , tải xuống phiên bản cuối cùng (.whl hoặc tar.gz) và cài đặt nó với lệnh này:

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

bằng cách sử dụng --userbạn không cần sử dụng sudo pip….

2) sử dụng virtualenv

trên máy trực tuyến chọn một thư mục có thiết bị đầu cuối cdvà chạy mã này:

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

Sau khi cài đặt tất cả các gói, bạn phải tạo một số requirements.txttrong khi virtualenv của bạn đang hoạt động, hãy viết

pip freeze > requirements.txt

mở một thiết bị đầu cuối mới và tạo một env khác như thế nào myenv2.

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

bây giờ bạn có thể đi đến thư mục ngoại tuyến nơi thư mục requirements.txttranferred_packagesthư mục của bạn đang ở đó. tải về các gói với mã sau đây và đặt tất cả chúng vào tranferred_packagesthư mục.

pip download -r requirements.txt

đưa thư mục ngoại tuyến của bạn vào máy tính ngoại tuyến và sau đó

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

có gì trong thư mục ngoại tuyến [tests.txt, tranferred_packages {Flask-0.10.1.tar.gz, ...}]

kiểm tra danh sách gói hàng của bạn

pip list

lưu ý: như chúng ta đang làm trong năm 2017, tốt hơn là sử dụng python 3. bạn có thể tạo python 3 virtualenv bằng lệnh này.

virtualenv -p python3 envname

2
Dường như có các bước bị thiếu hoặc "bị xáo trộn" ở đây, tôi sẽ thấy một 'hủy kích hoạt' và sau đó 'pip đóng băng' ... cd ngoại tuyến và ./tranferred_packages xuất hiện từ đâu - rõ ràng điều này có cần dọn dẹp không?
Hannu

có thể, nhưng bạn nên xem xét 'Tôi muốn có một bài viết ngắn gọn', 'quá trình đó rất phức tạp và tôi không thể viết từng bước (điều đó chỉ có thể có trong YouTube)'.
cyera

Đây là câu trả lời tốt nhất imho. Đã giúp rất nhiều
webofmars

Đây sẽ là câu trả lời tốt nhất nếu nó nói bất cứ điều gì về cách thiết lập thư mục tranferred_packages. Không có các bước quan trọng, -1
Zim

8

Tải xuống tarball , chuyển nó vào máy FreeBSD của bạn và giải nén nó, sau đó chạy python setup.py installvà bạn đã hoàn tất!

EDIT: Chỉ cần thêm vào đó, bạn cũng có thể cài đặt tarball với pip ngay bây giờ.


1
Những gì về tất cả các phụ thuộc? Cách tốt nhất để giải quyết chúng là gì? Tôi có cần phải cài đặt các phụ thuộc bằng tay không?
Chris Drantz

Vâng, đó là điều không may theo cách duy nhất tôi biết.
dav1d

8

Hãy để tôi đi qua quá trình từng bước:

  1. Trên máy tính được kết nối với internet, tạo một thư mục.
   $ mkdir packages
   $ cd packages
  1. mở một dấu nhắc lệnh hoặc shell và thực hiện lệnh sau:

    Giả sử gói bạn muốn là tensorflow

    $ pip download tensorflow

  2. Bây giờ, trên máy tính đích, sao chép packagesthư mục và áp dụng lệnh sau

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

Lưu ý rằng tensorflow-xyz.whlphải được thay thế bằng tên ban đầu của gói yêu cầu.


6

Sử dụng wheelcác gói biên dịch.

bó lên:

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

sao chép tarball và cài đặt:

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

Lưu ý wheelcác gói nhị phân không phải trên các máy.

Thêm ref. tại đây: https://pip.pypa.io/en/urdy/user_guide/#installation-bundles


1
Tôi gặp vấn đề với việc đóng gói trên máy với Python 3.6 và giải nén trên máy khác bằng Python 3.5: " <gói> .whl không phải là bánh xe được hỗ trợ trên nền tảng này ". Các phiên bản nguồn và đích có thể được yêu cầu để khớp với một số gói.
Juuso Ohtonen

5

Tôi đã có một vấn đề tương tự. Và tôi đã phải làm cho nó cài đặt theo cùng một cách, chúng tôi làm từ pypi.

Tôi đã làm những điều sau đây:

  1. Tạo một thư mục để lưu trữ tất cả các gói trong máy có truy cập internet.

    mkdir -p /path/to/packages/
  2. Tải xuống tất cả các gói vào đường dẫn

    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 thư mục gói và sao chép nó vào Máy không có quyền truy cập internet. Sau đó làm

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

    Sao chép các gói.tar.gz vào máy đích không có quyền truy cập internet.

  4. Trong máy không có quyền truy cập internet, hãy làm như sau (Giả sử bạn đã sao chép các gói tarred sang / path / to / pack / trong máy hiện tại)

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

    và dán nội dung sau vào bên trong và lưu nó.

    [global]
    timeout = 10
    find-links = file:///path/to/package/
    no-cache-dir = true
    no-index = true
  5. Cuối cùng, tôi đề nghị bạn sử dụng, một số hình thức virtualenvđể cài đặt các gói.

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

Bạn sẽ có thể tải xuống tất cả các mô-đun trong thư mục / đường dẫn / đến / gói / .

Lưu ý: Tôi chỉ làm điều này, vì tôi không thể thêm tùy chọn hoặc thay đổi cách chúng tôi cài đặt các mô-đun. Nếu không tôi đã làm

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

3

Đối với Pip 8.1.2, bạn có thể sử dụng pip download -r requ.txtđể tải các gói về máy cục bộ của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.