setuptools vs distutils: tại sao distutils vẫn là một thứ?


142

Python có một lịch sử khó hiểu của công cụ có thể được sử dụng để đóng gói và mô tả dự án: bao gồm distutilstrong thư viện chuẩn, distribute, distutils2, và setuptools(và có thể nhiều hơn). Có vẻ như distributedistutils2đã ngừng cung cấp setuptools, mà để lại hai tiêu chuẩn cạnh tranh.

Theo hiểu biết của tôi setuptoolscung cấp nhiều tùy chọn hơn (ví dụ: khai báo các phụ thuộc, kiểm tra, v.v.) so với distutils, tuy nhiên nó không được bao gồm trong thư viện chuẩn Python (chưa?).

Các Python Bao bì Hướng dẫn mua [ 1 ] khuyến cáo hiện nay:

Sử dụng setuptoolsđể xác định dự án và tạo Phân phối nguồn.

Và giải thích:

Mặc dù bạn có thể sử dụng thuần túy distutilscho nhiều dự án, nhưng nó không hỗ trợ xác định các phụ thuộc vào các dự án khác và thiếu một số tiện ích tiện lợi để tự động điền siêu dữ liệu gói chính xác được cung cấp bởi setuptools. Nằm ngoài thư viện tiêu chuẩn, setuptools cũng cung cấp một tính năng phù hợp hơn được thiết lập trên các phiên bản Python khác nhau và (không giống như distutils), setuptoolssẽ được cập nhật để tạo ra các định dạng chuẩn của Met Metadata 2.0 sắp tới trên tất cả các phiên bản được hỗ trợ.

Ngay cả đối với các dự án chọn sử dụng distutils, khi pip cài đặt các dự án đó trực tiếp từ nguồn (thay vì cài đặt từ tệp bánh xe dựng sẵn), nó sẽ thực sự xây dựng dự án của bạn bằng cách sử dụng setuptoolsthay thế.

Tuy nhiên, xem xét các tập tin setup.py của các dự án khác nhau cho thấy rằng điều này dường như không phải là một tiêu chuẩn thực tế. Nhiều gói vẫn sử dụng distutilsvà các gói hỗ trợ setuptoolsthường trộn setuptoolsvới distutilsví dụ: bằng cách nhập dự phòng:

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

Tiếp theo là một nỗ lực để tìm cách viết một thiết lập có thể được cài đặt bởi cả hai setuptoolsdistutils. Điều này thường bao gồm nhiều cách kiểm tra phụ thuộc dễ bị lỗi khác nhau, vì distutilskhông hỗ trợ các phụ thuộc trong chức năng thiết lập.

Tại sao mọi người vẫn nỗ lực thêm để hỗ trợ distutils- thực tế setuptoolslà không có trong thư viện tiêu chuẩn là lý do duy nhất? Những lợi thế của distutilsvà có bất kỳ nhược điểm nào của việc viết các tập tin setup.py chỉ hỗ trợ setuptools.


4
distutilsđã được hợp nhất trở lạisetuptools , nhưng có những ứng dụng cũ được viết để sử dụng distutilsvà có những chi phí liên quan để di chuyển theo đúng tiêu chuẩn.
tàu điện ngầm

3
"Có vẻ như phân phối và distutils2 đã bị ngừng sử dụng cho setuptools", chính xác, phân phối chỉ là một trình bao bọc cho setuptools bây giờ và distutils2 đã chết.
kay - SE là ác

1
setuptoolslà một giải pháp thay thế nâng cao cho distutilsnhưng lưu ý rằng " Trình cài đặt pip được đề xuất chạy tất cả các tập lệnh setup.py với setuptools, ngay cả khi chính tập lệnh chỉ nhậpdistutils " ( nguồn )
user2314737

Câu trả lời:


77

Có một cái nhìn vào câu hỏi SO này. Nó giải thích tất cả các phương pháp đóng gói rất tốt và có thể giúp trả lời câu hỏi của bạn ở một mức độ nào đó: Sự khác biệt giữa phân phối, distutils, setuptools và distutils2?

Distutils vẫn là công cụ tiêu chuẩn để đóng gói trong Python. Nó được bao gồm trong thư viện chuẩn (Python 2 và Python 3.0 đến 3.3). Nó rất hữu ích cho các bản phân phối Python đơn giản, nhưng thiếu các tính năng. Nó giới thiệu gói Python distutils có thể được nhập trong tập lệnh setup.py của bạn.

Setuptools được phát triển để khắc phục những hạn chế của Distutils và không được bao gồm trong thư viện chuẩn. Nó giới thiệu một tiện ích dòng lệnh gọi là easy_install. Nó cũng giới thiệu gói Python thiết lập có thể được nhập trong tập lệnh setup.py của bạn và gói pkg_resource Python có thể được nhập trong mã của bạn để xác định vị trí các tệp dữ liệu được cài đặt với bản phân phối. Một trong những vấn đề của nó là khỉ vá các gói Python. Nó nên hoạt động tốt với pip. Phiên bản mới nhất được phát hành vào tháng 7 năm 2013.

Vì vậy, như bạn có thể thấy setuptools nên được ưu tiên hơn cho distutils và tôi thấy câu hỏi của bạn đến từ đâu, tuy nhiên tôi không thấy distutils mất hỗ trợ bất cứ lúc nào, vì đơn giản, nó được sử dụng trong nhiều trường hợp với một số chương trình kế thừa phổ biến . Và như bạn có thể biết việc thay đổi những thứ này trong các chương trình cũ có thể khá khó khăn và gặp khá nhiều vấn đề, ví dụ như sự không tương thích, sau đó sẽ dẫn đến việc nhà phát triển phải viết lại mã nguồn. Vì vậy, có điều đó, và thực tế là distutils là một phần của thư viện python tiêu chuẩn trong khi setuptools thì không. Vì vậy, nếu bạn đang tạo một chương trình python, trong thời đại ngày nay, hãy sử dụng setuptools, tuy nhiên hãy nhớ rằng nếu không có distutils, setuptools sẽ không bao giờ tồn tại.


3
"Distutils vẫn là công cụ tiêu chuẩn để đóng gói bằng Python." mâu thuẫn với Hướng dẫn sử dụng bao bì Python.
cel

1
Tôi không tin như vậy, có nói rõ ràng rằng setuptools là tiêu chuẩn. Cũng lưu ý rằng, cụm từ đó được trích dẫn từ trang web tôi cung cấp, vì vậy, đó không phải là từ của tôi. Tuy nhiên đó là một ý kiến ​​mà tôi, trong số nhiều người khác đồng ý.

Tôi đã trao thưởng cho bạn tiền thưởng vì cộng đồng dường như đồng ý với bạn. Thật không may, câu hỏi này đã không nhận được nhiều sự chú ý như tôi muốn nó sẽ nhận được.
cel

easy_install là lý do chính khiến tôi từ chối setuptools - nó là một vấn đề lớn đối với tôi trong các gói sử dụng nó (dễ dàng hơn để đóng gói lại). Các tính năng khác là ok.
Stuart Gathman

14

thực tế là setuptools không có trong thư viện chuẩn là lý do duy nhất

Đó là một lý do. Sau đây là trực tiếp từ NumPysetup.py :

if len(sys.argv) >= 2 and ('--help' in sys.argv[1:] or
        sys.argv[1] in ('--help-commands', 'egg_info', '--version',
                        'clean')):
    # Use setuptools for these commands (they don't work well or at all
    # with distutils).  For normal builds use distutils.
    try:
        from setuptools import setup
    except ImportError:
        from distutils.core import setup

Vì vậy, NumPy thích setuptoolsnếu nó có thể tìm thấy nó. Nhưng sau đó SciPy đã từng làm điều này, cho đến khi nó được để thích distutilstrong một số tình huống. Trích dẫn nhật ký cam kết:

Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.

Tất nhiên, một sự hợp nhất giữa setuptoolsdistributesẽ giải quyết tất cả điều này trong thời gian tới hạn, nhưng nhiều gói vẫn cần hỗ trợ cài đặt Python 2.6.


1
distributelà một ngã ba setuptoolsvà bây giờ được sáp nhập trở lại.
R4444

10

Có một số lý do chúng ta vẫn nói và sử dụng distutils, mặc dù chắc chắn setuptools là bộ công cụ tốt hơn.

Thứ nhất, distutils có sẵn ở khắp mọi nơi. Nếu bạn đang tìm cách xây dựng một mô-đun để chia sẻ với người khác và không có bất kỳ yêu cầu phức tạp nào, thì nó được đảm bảo có sẵn trên máy công việc của bạn. Điều này đặc biệt quan trọng nếu bạn phải hỗ trợ các phiên bản cũ hơn của python hoặc nếu bạn thấy mình làm việc trong một môi trường xa lạ.

Thứ hai, setuptools cung cấp các cải tiến cho distutils. Do đó, nó được mô hình hóa sau bộ công cụ distutils và lấy tất cả cấu trúc của nó từ đó. Tài liệu cho setuptools giả định rằng trình đọc quen thuộc với distutils và chỉ các tài liệu về cách nó tăng cường bộ công cụ cơ sở. Bạn có thể nghĩ rằng distutils xác định phương ngữ và setuptools tăng cường phương ngữ đó.

Cách tiếp cận cá nhân của tôi cho các dự án mới là bắt đầu với giả định tôi sẽ sử dụng distutils. Chỉ khi dự án phát triển để yêu cầu một tính năng của setuptools thì tôi mới thực hiện nâng cấp. Các setuptools là một thay thế thả xuống cho các distutils, đó là một thay đổi một dòng đối với setup.py của tôi.


Cảm ơn câu trả lời của bạn. Tôi nghĩ rằng đối số khả dụng không thể quan trọng như vậy, vì cài đặt setuptools có thể được khởi động. Tôi thấy rằng nếu distutils cung cấp đủ chức năng - nó có ý nghĩa để sử dụng nó. Nhưng theo tôi, việc trộn lẫn distutils và setuptools không phải là một cách rất rõ ràng để đạt được mục tiêu của một người. Mặc dù, @larsmans đã cho thấy trong câu trả lời của mình một số khó khăn với setuptools buộc phải sử dụng distutils cho một số nhiệm vụ.
cel

9

Về cơ bản, đó là do sự phân chia trách nhiệm.

setuptoolskhông phải là một phần của thư viện chuẩn Python vì nó được duy trì bởi bên thứ 3 chứ không phải nhóm lõi Python. Có nghĩa là, trong số những thứ khác:

  • nó không được bao phủ bởi bộ kiểm tra lõi và không phụ thuộc vào chức năng cốt lõi
  • bản thân nó không đặt tiêu chuẩn cốt lõi cho các mô-đun bổ trợ (vị trí, phương tiện nhập, giao diện nhị phân của tiện ích mở rộng C, v.v.).
  • nó được cập nhật và phát hành độc lập với các bản phát hành Python

Về mặt hiệu quả, nhóm nòng cốt đã thu hẹp phạm vi của các bản phân phối , bảo lưu các phần "tiêu chuẩn cốt lõi" và "biên dịch cần thiết tối thiểu" cho chính họ trong khi để lại tất cả những thứ vượt quá (định dạng trình biên dịch / gói mở rộng / bất kỳ hỗ trợ nào) cho bên thứ 3. Mã trước đây bao gồm các "phần mở rộng" đó đã bị bỏ lại cho khả năng tương thích ngược.

Từ phân phối mô-đun Python - Tài liệu Python 2.7.12 :

Mặc dù việc sử dụng trực tiếp distutilsđang dần bị loại bỏ, nó vẫn đặt nền tảng cho cơ sở hạ tầng phân phối và đóng gói hiện tại, và nó không chỉ là một phần của thư viện tiêu chuẩn, mà tên của nó còn tồn tại theo những cách khác (như tên của danh sách gửi thư Được sử dụng để phối hợp phát triển tiêu chuẩn đóng gói Python).

Các gói cho các HĐH khác cũng có khả năng cung cấp setuptoolspipriêng biệt - vì những lý do đã nói ở trên

  • và bởi vì chúng không cần thiết - hoặc thậm chí gây bất lợi cho khả năng bảo trì - khi đã có một trình quản lý gói khác trên hệ thống.
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.