2012-06-18 39 views
82

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

+1

Liên quan: [Cách cài đặt gói theo require.txt từ thư mục cục bộ?] (http://stackoverflow.com/q/7225900/95735) –

Trả lời

42

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

 
$ 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 

Một số gói có thể phải được lưu trữ thành tarball 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 (ít ổn định hơn) của một cái gì đó. Một số gói không có trên PYPI, do đó, chúng cũng áp dụng cho chúng.

Giả sử bạn có ứng dụng Python được tạo đúng cách trong ~/src/myapp. ~/src/myapp/setup.py sẽ có danh sách install_requires đề cập đến một hoặc nhiều nội dung bạn có trong thư mục /pypi của mình. Cũng giống 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 bạn với tất cả các phụ thuộc cần thiết trong khi vẫn hack vào nó, bạn sẽ làm điều gì đó như thế này:

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

Bằng cách này ứng dụng của bạn sẽ được thực thi ngay từ thư mục nguồn của bạn. Bạn có thể hack vào 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 bạn và phụ thuộc của nó vào môi trường trăn hiện tại, bạn sẽ làm điều gì đó như thế này:

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

Trong cả hai trường hợp, việc xây dựng sẽ thất bại nếu một hoặc nhiều phụ thuộc aren' t có trong thư mục /pypi. Nó sẽ không cố gắng cài đặt một cách nhanh chóng 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 hoạt động virtual environment để tránh làm ô nhiễm môi trường Python toàn cầu của bạn. Đó là (virtualenv đó là) 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ục.

Nếu máy mà bạn đã xây dựng ứng dụng của bạn có kiến ​​trúc giống với máy mà bạn muốn triển khai, bạn có thể chỉ cần tarball toàn bộ thư mục môi trường ảo mà bạn easy_install -ed mọ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 (xem tùy chọn --relocatable). LƯU Ý: máy đích cần phải cài đặt cùng một phiên bản Python và mọi phụ thuộc C mà ứng dụng của bạn cũng phải được cài đặt sẵn (ví dụ: nếu bạn phụ thuộc vào PIL, thì libpng, libjpeg, v.v. được cài đặt sẵn).

+2

Thay vì '--allow-hosts = None' bạn có thể sử dụng nút chuyển' --no-index' – romor

+0

Bạn có thể giải thích cách tạo ứng dụng Python đúng cách không? –

+2

@PrabhjotRai vui lòng tham khảo https://packaging.python.org/distributing/ –

4

Tải xuống tarball, chuyển nó sang máy FreeBSD của bạn và giải nén nó, sau đó chạy python setup.py install và 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

Còn tất cả phụ thuộc thì sao? 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 theo cách thủ công không? –

+0

Vâng, đó không phải là cách duy nhất tôi biết. – dav1d

157

Tôi sử dụng tùy chọn -d (hoặc --download) để pip install, làm cho quá trình tải xuống tarball từ SDK trở nên đơn giản hơn nhiều.Ví dụ: pip install --download /path/to/some/dir celery sẽ tải xuống tarballs sdist cho cần tây và tất cả các phụ thuộc của nó là /path/to/some/dir (nhưng sẽ không cài đặt chúng). Sau đó, bạn có thể sử dụng pip install --no-index --find-links /path/to/some/dir/ celery để cài đặt cần tây bằng cách sử dụng các sdists đã tải xuống đó mà không cần truy cập mạng.

Quy trình tương tự hoạt động nếu bạn thay thế celery trong cả hai lệnh bằng -r requirements.txt, trong đó requirements.txt là tệp yêu cầu pip liệt kê tất cả các gói bạn muốn (và tùy chọn phiên bản bạn muốn).

CẬP NHẬT

không chấp nhận: pip cài đặt --download đã bị phản đối và sẽ loại bỏ trong tương lai. Pip hiện có một lệnh download cần được sử dụng thay vào đó là .

Lệnh là như thế này:
pip download -r requirements.txt

Đối python3:
pip3 download -r requirements.txt

+0

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

+0

[Rắn giỏ] (https://github.com/prezi/snakebasket) (được xây dựng trên đầu trang của pip) sẽ tải về phụ thuộc 'phụ thuộc là tốt. – vikki

+4

@vikki Không đúng, "pip install --download" 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. Rắn giỏ có thể làm những thứ 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 vì lý do đó. –

2

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

2

python ngoại tuyến. để làm điều này tôi sử dụng virtualenv (cách ly môi trường Python)

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

pip install virtualenv --user 

hoặc offline với WHL: đi đến link này, tải về phiên bản mới nhất (.whl hoặc tar. gz) và cài đặt đó bằng lệnh này:

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

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

2) sử dụng virtualenv

trên máy tính trực tuyến chọn một thư mục với thiết bị đầu cuối cd và 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 ra một requirements.txt như vậy trong khi virtualenv của bạn là đang hoạt động, 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ư myenv2.

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

bây giờ bạn có thể vào thư mục ẩn của bạn, nơi bạn thư mục requirements.txttranferred_packages đang chờ ở đó. tải xuống các gói có mã sau và đặt tất cả chúng vào thư mục tranferred_packages.

pip download -r requirements.txt 

mất thư mục ẩn của bạn vào máy tính ẩ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 

những gì có trong thư mục ẩn [requirements.txt, tranferred_packages {Flask-0.10.1.tar.gz, ...} ]

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

pip list 

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

virtualenv -p python3 envname 
+0

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

+0

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

2

Sử dụng wheel gói đã biên soạn.

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" *) 

bản sao 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/* 

Note wheel gói nhị phân không với các máy khác.

Thêm ref. ở đây: https://pip.pypa.io/en/stable/user_guide/#installation-bundles

+1

Tôi gặp sự cố với việc kết hợp trên máy với Python 3.6 và giải nén bằng Python 3.5: "_ .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 để phù hợp với một số gói. –

Các vấn đề liên quan