Python memiliki sejarah membingungkan alat yang dapat digunakan untuk paket dan menjelaskan proyek-proyek: ini termasuk distutils
di Perpustakaan Standard, distribute
, distutils2
, dan setuptools
(dan mungkin lebih). Tampaknya distribute
dan distutils2
tidak lagi mendukung setuptools
, yang meninggalkan dua standar yang bersaing.
Untuk pemahaman saya setuptools
menawarkan opsi yang jauh lebih banyak (misalnya mendeklarasikan dependensi, tes, dll) daripada distutils
, namun tidak termasuk dalam pustaka standar Python (belum?).
The Python Kemasan Panduan Pengguna [ 1 ] merekomendasikan sekarang:
Gunakan
setuptools
untuk mendefinisikan proyek dan membuat Distribusi Sumber.
Dan menjelaskan:
Meskipun Anda dapat menggunakan pure
distutils
untuk banyak proyek, itu tidak mendukung mendefinisikan dependensi pada proyek lain dan kehilangan beberapa utilitas kenyamanan untuk secara otomatis mengisi metadata paket dengan benar yang disediakan olehsetuptools
. Berada di luar perpustakaan standar, setuptools juga menawarkan set fitur yang lebih konsisten di berbagai versi Python, dan (tidak sepertidistutils
),setuptools
akan diperbarui untuk menghasilkan format standar "Metadata 2.0" yang akan datang pada semua versi yang didukung.Bahkan untuk proyek yang memang memilih untuk digunakan
distutils
, ketika pip menginstal proyek seperti itu langsung dari sumber (daripada menginstal dari file roda prebuilt), itu sebenarnya akan membangun proyek Anda menggunakansetuptools
sebagai gantinya.
Namun, melihat ke berbagai file setup.py proyek mengungkapkan bahwa ini tampaknya bukan standar yang sebenarnya. Banyak paket masih menggunakan distutils
dan mereka yang mendukung setuptools
sering mencampur setuptools
dengan distutils
misalnya dengan melakukan impor fallback:
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
Diikuti oleh upaya untuk menemukan cara untuk menulis pengaturan yang dapat diinstal oleh keduanya setuptools
dan distutils
. Ini sering mencakup berbagai cara pengecekan dependensi rawan kesalahan, karena distutils
tidak mendukung dependensi dalam fungsi pengaturan.
Mengapa orang masih melakukan upaya ekstra untuk mendukung distutils
- adalah fakta bahwa setuptools
tidak ada di perpustakaan standar satu-satunya alasan? Apa kelebihannya distutils
dan adakah kekurangan menulis file setup.py yang hanya mendukung setuptools
.
distutils
telah digabungkan kembali ke dalamsetuptools
, tetapi ada aplikasi warisan yang ditulis untuk digunakandistutils
dan ada biaya yang diperlukan untuk bermigrasi ke standar yang benar.setuptools
adalah alternatif yang disempurnakan untukdistutils
tetapi perhatikan bahwa " Penginstal pip yang disarankan menjalankan semua skrip setup.py dengan , bahkan jika skrip itu sendiri hanya mengimporsetuptools
distutils
" ( sumber )Jawaban:
Lihatlah pertanyaan SO ini. Ini menjelaskan semua metode pengemasan dengan sangat baik, dan mungkin dapat membantu menjawab pertanyaan Anda sampai batas tertentu: Perbedaan antara distribusi, distutils, setuptools, dan distutils2?
Jadi, seperti yang Anda lihat, setuptools lebih disukai daripada distutil, dan saya melihat dari mana pertanyaan Anda berasal, namun saya tidak melihat distutil kehilangan dukungan dalam waktu dekat, karena, secara sederhana, ini digunakan dalam banyak kasus dengan beberapa program lawas populer . Dan seperti yang Anda ketahui, mengubah hal-hal semacam ini dalam program legacy bisa sangat menyebalkan dan disertai beberapa masalah, misalnya ketidakcocokan, yang kemudian akan menyebabkan pengembang harus menulis ulang kode sumber. Jadi ada itu, dan juga fakta bahwa distutils adalah bagian dari library python standar sedangkan setuptools tidak. Jadi, jika Anda membuat program python, di zaman sekarang ini, gunakan setuptools, namun perlu diingat bahwa tanpa distutils, setuptools tidak akan pernah ada.
sumber
Itu salah satu alasannya. Berikut ini adalah langsung dari NumPy
setup.py
:Jadi NumPy lebih suka
setuptools
jika bisa menemukannya. Tapi kemudian SciPy biasa melakukan ini, sampai ditambal untuk memilihdistutils
dalam beberapa situasi. Mengutip log komit:Tentu saja, penggabungan antara
setuptools
dandistribute
harus menyelesaikan semua ini pada waktunya, tetapi banyak paket masih perlu mendukung instalasi Python 2.6.sumber
distribute
adalah garpusetuptools
dan sekarang bergabung kembali.Ada beberapa alasan mengapa kita masih membicarakan dan menggunakan distutils, meskipun setuptools tidak diragukan lagi merupakan set alat yang lebih baik.
Pertama, distutil tersedia di mana-mana. Jika Anda ingin membuat modul untuk berbagi dengan orang lain, dan tidak memiliki persyaratan yang rumit, itu dijamin akan tersedia di mesin kerja Anda. Ini sangat penting jika Anda harus mendukung versi python yang lebih lama, atau jika Anda menemukan diri Anda bekerja di lingkungan yang tidak dikenal.
Kedua, setuptools menyediakan perangkat tambahan untuk distutils. Oleh karena itu dimodelkan setelah alat distutils ditetapkan dan mengambil semua strukturnya dari sana. Dokumentasi untuk setuptools mengasumsikan bahwa pembaca sudah terbiasa dengan distutils dan hanya mendokumentasikan bagaimana meningkatkan set alat dasar. Anda dapat memikirkannya bahwa distutils mendefinisikan dialek dan setuptools meningkatkan dialek itu.
Pendekatan pribadi saya untuk proyek-proyek baru dimulai dengan asumsi saya akan menggunakan distutils. Hanya ketika proyek tumbuh membutuhkan fitur setuptools saya membuat pembaruan. Setuptools adalah pengganti drop-in untuk distutils, ini adalah perubahan satu-baris untuk setup.py saya.
sumber
Pada dasarnya, ini karena pembagian tanggung jawab.
setuptools
bukan bagian dari pustaka standar Python karena dikelola oleh pihak ke-3 daripada tim inti Python. Yang berarti, antara lain:Secara efektif, tim inti telah mempersempit ruang lingkup distutil , memesan bagian "standar inti" dan "kompilasi minimal yang diperlukan" untuk diri mereka sendiri sambil menyerahkan semua hal di luar itu (kompiler / format paket / dukungan apa pun yang diperluas) kepada pihak ketiga. Kode yang sebelumnya mencakup "bagian yang diperluas" dibiarkan basi untuk kompatibilitas ke belakang.
Dari Mendistribusikan Modul Python - dokumentasi Python 2.7.12 :
Paket untuk OS lain juga cenderung untuk menyediakan
setuptools
danpip
secara terpisah - untuk alasan yang disebutkan di atassumber