2011-12-18 11 views
39

Tôi đã tự dạy mình Python thông qua cuốn sách "Learn Python The Hard Way" (2nd Edition). Trong bài tập 46, nó bảo tôi đọc trên Pip, Distribute và một vài gói khác.Cách setuptools, distribution và pip liên quan đến nhau như thế nào?

Tài liệu cho pip là đủ rõ ràng. Nó cho phép tôi cài đặt/gỡ cài đặt và nâng cấp các gói. Đọc tài liệu cho phân phối, nó về cơ bản dường như làm điều tương tự:

Dễ dàng tải, xây dựng, lắp đặt, nâng cấp, và gỡ bỏ cài đặt các gói Python

sự khác biệt giữa pip là gì và phân phối, và làm thế nào để chúng liên quan đến cái khác?

+0

Related: http://stackoverflow.com/questions/6344076/differences-between-distribute-distutils-setuptools-and-distutils2 – guettli

Trả lời

69

[2014-10 TL; DR: distribute đã chết, sử dụng pip, mới setuptools, và, đối với phân phối nhị phân, wheels. bên dưới hơn.]


[câu trả lời Original]

Distribute là một ngã ba của già setuptools nên gần như tất cả ý kiến ​​mà theo áp dụng chung cho Distribute và setuptools. Setuptools là một nỗ lực để điền vào một số lỗ trong gói thư viện chuẩn cũ hơn của Python, Distutils. Các chức năng được thêm vào của Setuptools như tải xuống tự động các gói thông qua giao diện dòng lệnh, easy_install và một số cấp quản lý phụ thuộc. Tuy nhiên, một phân đoạn của cộng đồng Python có ý kiến ​​rằng các công cụ thiết lập quá xâm nhập và có quá nhiều phép thuật hậu trường cho một số tính năng của nó.

pip là giao diện cấp cao hơn trên các công cụ thiết lập hoặc Phân phối. Nó sử dụng chúng để thực hiện nhiều chức năng của nó nhưng tránh một số tính năng gây tranh cãi của chúng, như trứng nén. pip cũng cung cấp các tính năng không có sẵn trong setuptools, như lệnh gỡ cài đặt và khả năng xác định các bộ yêu cầu cố định và tái tạo đáng tin cậy một bộ gói. Có một so sánh tính năng hoàn chỉnh hơn here.

Tại sao có quá nhiều thành phần (và có nhiều thành phần hơn, chẳng hạn như buildout)? Rất nhiều lý do: giải pháp phải hoạt động trên tất cả các nền tảng chính mà Python được hỗ trợ (tức là Unix-y, Windows, Mac OS X), do đó, việc xây dựng và cài đặt trình bày một tập hợp các sự cố phức tạp ; giống như nhiều dự án mã nguồn mở, Python cơ bản là tất cả tình nguyện viên và nhiều nhà phát triển không phải tất cả đều quan tâm đến các vấn đề về đóng gói và cài đặt; có một sự bảo thủ tự nhiên về việc thêm các tính năng mới chưa được chứng minh chính vào thư viện chuẩn; sự khác biệt về ý kiến, v.v.

Hiện tại, có một dự án đang được tiến hành để cung cấp thay thế cho Distutils và có thể cho một số tiện ích bổ sung cấp cao hơn. Nó được lên kế hoạch để được phát hành trong thư viện chuẩn Python 3.3 là gói packaging và là một phần bổ trợ cho các phiên bản cũ của Python là Distutils2.

Nói tóm lại, mối quan hệ hiện nay là:

pip -> [ setuptools | Distribute ] -> Distutils -> Python core 
            | 
    3rd party packages    |  included in Python 
            | 

UPDATE (2012-07): Trước khi tính năng đang cắt cho Python 3.3, nó đã quyết định rằng packaging là không hoàn toàn sẵn sàng chưa để phát hành trong thư viện chuẩn nên nó đã bị xóa khỏi bản phát hành 3.3. Công việc sẽ tiếp tục trên Distutils2 có sẵn thông qua PyPI và trên những gì sẽ được bao gồm trong thư viện chuẩn cho Python 3.4.


UPDATE (2014-10): Đã có những thay đổi hơn nữa trong thế giới của Python bao bì từ câu trả lời này là cập nhật lần cuối.

  • Quan trọng nhất, kể từ giữa năm 2013, sự rạn nứt giữa setuptoolsdistribute đã được chữa lành và hoạt động phát triển has been merged into a new setuptools project. distribute hiện tại là không còn được dùng nữa và không còn được duy trì; sử dụng mới setuptools thay vì nhưng không sử dụng easy_install làm trình cài đặt của nó.

  • pip đã trở thành công cụ cài đặt de-facto và may mắn (cho Python gói không có quy định khác do quản lý gói của nền tảng của bạn) hoặc trong hoặc bên ngoài của môi trường ảo (virtualenv hoặc pyvenv).

  • Thay vì cũ setuptools bdist eggs, wheels có trở thành định dạng phân phối nhị phân may mắn cho gói Python.

  • As of Python 3.4, a version of pip với wheel hỗ trợ hiện đang vận chuyển với các python.org cài đặt nhị phân chính thức và gói nguồn và người ta dự đoán rằng pip cũng sẽ bao gồm trong next maintenance release of Python 2.7 (2.7.9).

  • Distutils2packaging hiện không hoạt động.

Chi tiết khác trong tài liệu Python 3 mới và Python Packaging User Guide mới.

+1

Đó là một lời giải thích tuyệt vời, cảm ơn bạn! Tôi đến từ một nền tảng PHP vì vậy nó là loại áp đảo bao nhiêu mô-đun/gói chồng chéo bạn phải hiểu. – babonk

+0

Thực hiện cùng một hướng dẫn và lời khuyên của bạn đã giúp ích rất nhiều. Cảm ơn Ned. –

+0

Đã có nhiều thay đổi * * trong thế giới bao bì Python kể từ câu trả lời gốc. Xem bản cập nhật mới nhất để biết thêm thông tin hiện tại. –