Sự khác nhau giữa phân phối, distutils, setuptools và distutils2?


594

Tình huống

Tôi đang cố gắng chuyển một thư viện mã nguồn mở sang Python 3. ( SymPy , nếu có ai thắc mắc.)

Vì vậy, tôi cần chạy 2to3tự động khi xây dựng cho Python 3. Để làm điều đó, tôi cần sử dụng distribute. Vì vậy, tôi cần phải chuyển hệ thống hiện tại, mà (theo doctest) là distutils.


Vấn đề

Thật không may, tôi không chắc chắn sự khác biệt giữa các modules- là những gì distutils, distribute, setuptools. Tài liệu này sơ sài là tốt nhất, vì tất cả chúng dường như là một ngã ba của nhau, dự định tương thích trong hầu hết các trường hợp (nhưng thực tế, không phải tất cả), v.v.


Câu hỏi

Ai đó có thể giải thích sự khác biệt? Tôi nên sử dụng cái gì? Giải pháp hiện đại nhất là gì? (Bên cạnh đó, tôi cũng đánh giá cao một số hướng dẫn về cách chuyển đến Distribute, nhưng đó là một câu hỏi vượt quá phạm vi của câu hỏi)


22
Làm thế nào khó hiểu? Tôi đến với python từ nền Java / C ++. Trong những tình huống đó, phân phối là rất thẳng về phía trước. Với python, tôi a, hoàn toàn bối rối về tất cả các hệ thống phân phối này.
Raffi Khatchadourian

75
Tôi đồng ý, việc đóng gói / cài đặt Python có quá nhiều lựa chọn thay thế mà không có hướng dẫn rõ ràng từ cộng đồng.
Sabuncu

6
Tôi chỉ muốn liên kết thông tin liên quan này trên pip không hỗ trợ phân phối nhị phân lucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere
pixelbeat

@pixelbeat pip không hỗ trợ cài đặt các bánh xe (được gọi là phân phối nhị phân), liên kết đó đã lỗi thời.
Flimm

Câu trả lời:


836

Kể từ tháng 3 năm 2020, hầu hết các câu trả lời khác cho câu hỏi này đã hết hạn vài năm. Khi bạn gặp lời khuyên về các vấn đề về bao bì Python, hãy nhớ xem ngày xuất bản và không tin vào thông tin lỗi thời.

Các Python Bao bì Hướng dẫn mua là đáng đọc. Mỗi trang đều có ngày "cập nhật lần cuối" được hiển thị, do đó bạn có thể kiểm tra mức độ truy cập của hướng dẫn và nó khá toàn diện. Thực tế là nó được lưu trữ trên một tên miền phụ của python.org của Python Software Foundation chỉ làm tăng thêm uy tín cho nó. Các dự án Tóm tắt trang đặc biệt liên quan ở đây.

Tóm tắt các công cụ:

Dưới đây là tóm tắt về cảnh quan bao bì Python:

Các công cụ được hỗ trợ:

Các công cụ không dùng nữa / bị bỏ rơi:

  • distributelà một ngã ba của setuptools. Nó đã chia sẻ cùng một không gian tên, vì vậy nếu bạn đã cài đặt Phân phối, import setuptoolsthực tế sẽ nhập gói được phân phối với Phân phối. Phân phối đã được hợp nhất trở lại vào Setuptools 0.7 , vì vậy bạn không cần phải sử dụng Phân phối nữa. Trên thực tế, phiên bản trên Pypi chỉ là một lớp tương thích để cài đặt Setuptools.

  • distutils2là một nỗ lực để có sản phẩm tốt nhất của distutils, setuptoolsdistributevà trở thành công cụ tiêu chuẩn bao gồm trong thư viện chuẩn của Python. Ý tưởng là nó distutils2sẽ được phân phối cho các phiên bản Python cũ và distutils2sẽ được đổi tên thành packagingPython 3.3, bao gồm nó trong thư viện tiêu chuẩn của nó. Các kế hoạch này đã không đi như dự định, tuy nhiên, và hiện tại, distutils2là một dự án bị bỏ hoang . Bản phát hành mới nhất là vào tháng 3 năm 2012 và trang chủ Pypi của nó cuối cùng đã được cập nhật để phản ánh cái chết của nó.

Khác:

Có những công cụ khác, nếu bạn quan tâm, hãy đọc Tóm tắt dự án trong Hướng dẫn sử dụng bao bì Python. Tôi sẽ không liệt kê tất cả, để không lặp lại trang đó, và để giữ cho câu trả lời phù hợp với câu hỏi, đó là chỉ về distribute, distutils, setuptoolsdistutils2.

Sự giới thiệu:

Nếu tất cả những điều này là mới đối với bạn và bạn không biết bắt đầu từ đâu, tôi sẽ khuyên bạn nên họcsetuptools cùng với pipvirtualenvtất cả đều phối hợp rất tốt.

Nếu bạn đang tìm kiếm vào virtualenv, bạn có thể quan tâm đến câu hỏi này: sự khác nhau giữa là gì venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, vv? . (Vâng, tôi biết, tôi than vãn với bạn.)



6
Và không có vẻ tốt hơn: 'Distribute' is a now deprecated fork of the 'Setuptools' project.Trang phân phối @ PyPI.
KurzingMetal

3
@KurenedMetal, theo folks SetupTools, setuptools 0.7 sẽ bao gồm cả phân phối và các trình thiết lập cũ khôi phục lại trật tự cho vũ trụ. Vì vậy, mọi thứ thực sự được thiết lập để cải thiện đáng kể!
John McDonnell

8
Các Python Bao bì Hướng dẫn mua sẽ có các thông tin nhất up-to-date về tình trạng bao bì python. Nó được ghi nhận bởi Nick Coughlan tại PyCon 2013 .
imanuelcostigan

1
@Flimm Bản chỉnh sửa cuối cùng cách đây khá lâu. Bento đã trưởng thành chưa?
Martin Thoma

251

Tôi là người bảo trì distutils và distutils2 / đóng góp. Tôi đã nói về bao bì Python tại ConFoo 2011 và những ngày này tôi đang viết một phiên bản mở rộng của nó. Nó chưa được xuất bản, vì vậy đây là những trích đoạn sẽ giúp xác định mọi thứ.

  • Distutils là công cụ tiêu chuẩn được sử dụng để đóng gói. Nó hoạt động khá tốt cho các nhu cầu đơn giản, nhưng bị hạn chế và không tầm thường để mở rộng.

  • Setuptools là một dự án được sinh ra từ mong muốn lấp đầy chức năng distutils bị thiếu và khám phá các hướng mới. Trong một số giao tiếp, đó là một tiêu chuẩn thực tế . Nó sử dụng phương pháp vá khỉ và ma thuật được các nhà phát triển cốt lõi Python cau mày.

  • Phân phối là một nhánh của Setuptools được các nhà phát triển bắt đầu cảm thấy rằng tốc độ phát triển của nó quá chậm và không thể phát triển nó. Sự phát triển của nó đã bị chậm lại đáng kể khi distutils2 được bắt đầu bởi cùng một nhóm. Cập nhật 2013-tháng 8: phân phối được hợp nhất trở lại vào setuptools và ngừng.

  • Distutils2 là một thư viện distutils mới, được bắt đầu như một nhánh của cơ sở mã hóa, với những ý tưởng hay được lấy từ các công cụ thiết lập (trong đó một số được thảo luận kỹ trong PEP) và trình cài đặt cơ bản được lấy cảm hứng từ pip. Tên thực tế bạn sử dụng để nhập Distutils2 nằm packagingtrong thư viện chuẩn Python 3.3+, hoặc distutils2trong 2.4+ và 3.1 .33. (Một backport sẽ sớm xuất hiện.) Distutils2 không tạo ra bản phát hành Python 3.3 và nó đã bị giữ.

Thêm thông tin:

Tôi hy vọng sớm hoàn thành hướng dẫn của mình, nó sẽ chứa nhiều thông tin hơn về các điểm mạnh và yếu của mỗi thư viện và hướng dẫn chuyển tiếp.


1
Số distutils2 có một số ý tưởng hay từ setuptools / phân phối, sau khi tiêu chuẩn hóa (PEP) hay không (ví dụ: tôi cố vấn một sinh viên GSoC, người đã thêm lệnh phát triển và tạo tập lệnh tự động), nhưng nó sẽ không bao giờ bị bỏ rơi thay thế: có một số phần chúng tôi không muốn (trứng, tích hợp VCS, v.v.). OTOH, distutils2 có một số thứ mà setuptools / phân phối không có. Để dễ dàng chuyển đổi, tôi nghĩ các nhà phát triển phân phối có thể sẽ sử dụng distutils2 để hỗ trợ các tiêu chuẩn và công cụ mới; Tôi cũng nghĩ rằng tôi nhớ nhà phát triển setuptools nói rằng anh ta muốn hỗ trợ các tiêu chuẩn mới.
Éric Araujo

1
Trường hợp ez_setup rơi vào đâu trong tất cả những điều này? Ngoài ra có bất kỳ cập nhật cho trạng thái của distutils2?
James McMahon

2
@ ÉricAraujo Xin lỗi khi nghe về sự chậm trễ. Tôi thực sự hy vọng nó đã sẵn sàng trong thời gian cho 3,4! Tôi yêu Python, nhưng bao bì luôn khiến tôi đập đầu vào tường. (Trong các tin tức khác, hướng dẫn của bạn đến như thế nào? Nếu nó kết thúc, bạn có thể liên kết nó trong câu trả lời của mình ở trên không?)
Zearin

9
@AlexisHuet Loại bình luận này sẽ tốt hơn nếu nó chứa liên kết đến bình luận bên dưới (mà bạn có thể nhận được từ sharenút).
erikbwork 26/03/13

2
có lẽ bạn nên cập nhật câu trả lời để đề cập distributegần đây đã được hợp nhất trở lại setuptools. Thực tế là phần lớn các thông tin ngoài luồng đã làm tăng thêm sự nhầm lẫn
Amro

5

LƯU Ý: Trả lời không dùng nữa, Phân phối hiện đã lỗi thời. Câu trả lời này không còn hiệu lực kể từ khi Cơ quan đóng gói Python được thành lập và đã thực hiện rất nhiều công việc dọn dẹp này.


Đúng, bạn hiểu rồi : -o tôi nghĩ tại thời điểm này, gói ưu tiên là Phân phối , là một nhánh của setuptools, là phần mở rộng của distutils (hệ thống đóng gói ban đầu). Setuptools không được duy trì nên đã bị rẽ nhánh và đổi tên, tuy nhiên khi cài đặt, nó sử dụng tên gói của setuptools! Tôi nghĩ rằng hầu hết các nhà phát triển Python hiện nay đều sử dụng Phân phối và tôi có thể nói chắc chắn rằng tôi làm được.


Đối với hồ sơ, tôi đã chấp nhận câu trả lời này vì nó cho tôi biết tình hình hiện tại (Và cái ngã ba là sự mở rộng của mối quan hệ mà hình ảnh trong câu trả lời khác chỉ không đề cập đến). Và ở đâu đó dọc đường tôi cũng biết rằng tài liệu thường không chắc chắn những gì nó đang cố nói.
VPeric

2
@VPeric, Thật vậy, tài liệu phản ánh thực tế rằng khía cạnh này của con trăn đang ở trong tình trạng thay đổi / lộn xộn.
juanchopanza

2

Tôi nhận ra rằng tôi đã trả lời câu hỏi phụ của bạn mà không giải quyết các giả định không nghi ngờ trong vấn đề ban đầu của bạn:

Tôi đang cố gắng chuyển một thư viện mã nguồn mở (SymPy, nếu có ai thắc mắc) sang Python 3. Để làm điều này, tôi cần chạy tự động 2to3 khi xây dựng cho Python 3.

Bạn có thể , không cần . Các chiến lược khác được mô tả tại http://docs.python.org/dev/howto/pyporting

Để làm điều đó, tôi cần sử dụng phân phối,

Bạn có thể :) distutils hỗ trợ chuyển đổi 2to3 thời gian xây dựng cho mã (không phải tài liệu), theo cách khác phân phối: http://docs.python.org/dev/howto/pyporting#during-installation


Cảm ơn, mặc dù chúng tôi đã quyết định giải quyết vấn đề bằng cách viết tập lệnh của chúng tôi để xử lý chuyển đổi. Và vâng, tôi biết có nhiều lựa chọn khác ngoài việc sử dụng 2to3, nhưng SymPy là một cơ sở mã phức tạp (khoảng 200 nghìn + lần trước tôi đã kiểm tra) và sử dụng 2to3 là ​​chiến lược thực tế duy nhất. Cảm ơn một lần nữa, trong mọi trường hợp!
VPeric

2

Cập nhật câu hỏi này vào cuối năm 2014, nơi may mắn là sự hỗn loạn bao bì Python đã được dọn dẹp rất nhiều bởi người quản lý gói " conda " của Continuum .

Đặc biệt, conda nhanh chóng cho phép tạo ra " môi trường " conda . Bạn có thể định cấu hình môi trường của mình với các phiên bản Python khác nhau. Ví dụ:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

sẽ tạo hai môi trường Python ("py34" hoặc "py26") với các phiên bản Python khác nhau.

Sau đó, bạn có thể gọi môi trường với phiên bản Python cụ thể bằng:

source activate <env name>

Tính năng này có vẻ đặc biệt hữu ích trong trường hợp bạn phải đối phó với phiên bản Python khác nhau.

Hơn nữa, conda có các tính năng sau:

  • Thuyết bất khả tri
  • Đa nền tảng
  • Không yêu cầu quyền quản trị
  • Quản lý phụ thuộc thông minh (bằng cách giải SAT)
  • Thỏa thuận độc đáo với các thư viện cấp C, Fortran và hệ thống mà bạn có thể phải liên kết với

Điểm cuối cùng đó đặc biệt quan trọng nếu bạn đang ở trong lĩnh vực điện toán khoa học.

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.