setuptools vs distutils: mengapa distutils masih menjadi masalah?

143

Python memiliki sejarah membingungkan alat yang dapat digunakan untuk paket dan menjelaskan proyek-proyek: ini termasuk distutilsdi Perpustakaan Standard, distribute, distutils2, dan setuptools(dan mungkin lebih). Tampaknya distributedan distutils2tidak lagi mendukung setuptools, yang meninggalkan dua standar yang bersaing.

Untuk pemahaman saya setuptoolsmenawarkan 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 setuptoolsuntuk mendefinisikan proyek dan membuat Distribusi Sumber.

Dan menjelaskan:

Meskipun Anda dapat menggunakan pure distutilsuntuk 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 oleh setuptools. Berada di luar perpustakaan standar, setuptools juga menawarkan set fitur yang lebih konsisten di berbagai versi Python, dan (tidak seperti distutils), setuptoolsakan 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 menggunakan setuptoolssebagai gantinya.

Namun, melihat ke berbagai file setup.py proyek mengungkapkan bahwa ini tampaknya bukan standar yang sebenarnya. Banyak paket masih menggunakan distutilsdan mereka yang mendukung setuptoolssering mencampur setuptoolsdengan distutilsmisalnya 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 setuptoolsdan distutils. Ini sering mencakup berbagai cara pengecekan dependensi rawan kesalahan, karena distutilstidak mendukung dependensi dalam fungsi pengaturan.

Mengapa orang masih melakukan upaya ekstra untuk mendukung distutils- adalah fakta bahwa setuptoolstidak ada di perpustakaan standar satu-satunya alasan? Apa kelebihannya distutilsdan adakah kekurangan menulis file setup.py yang hanya mendukung setuptools.

cel
sumber
4
distutilstelah digabungkan kembali ke dalamsetuptools , tetapi ada aplikasi warisan yang ditulis untuk digunakan distutilsdan ada biaya yang diperlukan untuk bermigrasi ke standar yang benar.
metatoaster
3
"Tampaknya distribusi dan distutils2 dihentikan demi setuptools", benar, mendistribusikan hanya pembungkus untuk setuptools sekarang, dan distutils2 sudah mati.
kay - SE jahat
1
setuptoolsadalah alternatif yang disempurnakan untuk distutilstetapi perhatikan bahwa " Penginstal pip yang disarankan menjalankan semua skrip setup.py dengan , bahkan jika skrip itu sendiri hanya mengimporsetuptoolsdistutils " ( sumber )
user2314737

Jawaban:

77

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?

Distutils masih merupakan alat standar untuk pengemasan dengan Python. Ini termasuk dalam pustaka standar (Python 2 dan Python 3.0 hingga 3.3). Ini berguna untuk distribusi Python sederhana, tetapi tidak memiliki fitur. Ini memperkenalkan paket Python distutils yang dapat diimpor dalam skrip setup.py Anda.

Setuptools dikembangkan untuk mengatasi keterbatasan Distutils, dan tidak termasuk dalam perpustakaan standar. Itu memperkenalkan utilitas baris perintah yang disebut easy_install. Ini juga memperkenalkan paket Python setuptools yang dapat diimpor dalam skrip setup.py Anda, dan paket Python pkg_resources yang dapat diimpor dalam kode Anda untuk mencari file data yang diinstal dengan distribusi. Salah satu gotchas-nya adalah ia menambal paket Python distutils. Ini harus bekerja dengan baik dengan pip. Versi terbaru dirilis pada Juli 2013.

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.

kubanczyk
sumber
3
"Distutils masih merupakan alat standar untuk pengemasan dengan Python." bertentangan dengan Panduan Pengguna Kemasan Python.
cel
1
Saya tidak percaya begitu, apakah itu secara eksplisit mengatakan bahwa setuptools adalah standar. Perhatikan juga, frasa itu dikutip dari situs web yang saya berikan, jadi itu bukan kata-kata saya. Namun itu adalah pendapat yang saya, di antara banyak orang lain setuju dengan.
Saya memberi Anda hadiah karena komunitas tampaknya setuju dengan Anda. Sayangnya pertanyaan ini tidak mendapatkan banyak perhatian seperti yang saya harapkan.
sel
easy_install adalah alasan utama saya menolak setuptools - ini telah menjadi sumber masalah besar bagi saya dalam paket yang menggunakannya (lebih mudah hanya mengemas ulang). Fitur lainnya ok.
Stuart Gathman
14

adalah fakta bahwa setuptools tidak ada di perpustakaan standar satu-satunya alasan

Itu salah satu alasannya. Berikut ini adalah langsung dari 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

Jadi NumPy lebih suka setuptoolsjika bisa menemukannya. Tapi kemudian SciPy biasa melakukan ini, sampai ditambal untuk memilih distutilsdalam beberapa situasi. Mengutip log komit:

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

Tentu saja, penggabungan antara setuptoolsdan distributeharus menyelesaikan semua ini pada waktunya, tetapi banyak paket masih perlu mendukung instalasi Python 2.6.

Fred Foo
sumber
1
distributeadalah garpu setuptoolsdan sekarang bergabung kembali.
R4444
10

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.

pengguna590028
sumber
Terima kasih atas jawaban anda. Saya pikir argumen ketersediaan tidak begitu penting, karena instalasi setuptools dapat di-bootstrap. Saya melihat bahwa jika distutils menyediakan fungsionalitas yang cukup - masuk akal untuk menggunakannya. Tetapi mencampur distutils dan setuptools menurut saya bukanlah cara yang sangat bersih untuk mencapai tujuan seseorang. Meskipun, @ larsmans menunjukkan dalam jawabannya beberapa kesulitan dengan setuptools yang memaksa untuk menggunakan distutils untuk beberapa tugas.
sel
9

Pada dasarnya, ini karena pembagian tanggung jawab.

setuptoolsbukan bagian dari pustaka standar Python karena dikelola oleh pihak ke-3 daripada tim inti Python. Yang berarti, antara lain:

  • itu tidak tercakup oleh suite uji inti dan tidak diandalkan oleh fungsionalitas inti
  • itu tidak sendiri menetapkan standar inti untuk modul tambahan (lokasi mereka, cara impor, antarmuka biner ekstensi C dll.).
  • ini diperbarui dan dirilis secara independen dari rilis Python

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 :

Sementara penggunaan langsung distutilssedang dihapus, masih meletakkan dasar untuk infrastruktur pengemasan dan distribusi saat ini, dan itu tidak hanya tetap menjadi bagian dari perpustakaan standar, tetapi namanya hidup dengan cara lain (seperti nama milis digunakan untuk mengoordinasikan pengembangan standar kemasan Python).

Paket untuk OS lain juga cenderung untuk menyediakan setuptoolsdan pipsecara terpisah - untuk alasan yang disebutkan di atas

  • dan karena mereka tidak diperlukan - atau bahkan merugikan untuk pemeliharaan - ketika sudah ada manajer paket lain pada sistem.
ivan_pozdeev
sumber