Perbedaan antara distribusi, distutils, setuptools dan distutils2?

594

Situasi

Saya mencoba untuk port perpustakaan open-source ke Python 3. ( SymPy , kalau ada yang bertanya-tanya.)

Jadi, saya perlu menjalankan 2to3secara otomatis ketika membangun untuk Python 3. Untuk melakukan itu, saya perlu menggunakan distribute. Karena itu, saya perlu mem-port sistem saat ini, yang (menurut doctest) distutils.


Masalah

Sayangnya, saya tidak yakin apa perbedaan antara modules- ini distutils, distribute, setuptools. Dokumentasinya kurang lengkap, karena semuanya tampak seperti percabangan satu sama lain, dimaksudkan untuk kompatibel dalam sebagian besar keadaan (tetapi sebenarnya, tidak semua) ... dan seterusnya, dan seterusnya.


Pertanyaan

Bisakah seseorang menjelaskan perbedaannya? Apa yang harus saya gunakan? Apa solusi paling modern? (Sebagai tambahan, saya juga menghargai beberapa panduan tentang porting Distribute, tapi itu sedikit di luar cakupan pertanyaan ...)

VPeric
sumber
22
Betapa membingungkan? Saya datang ke python dari latar belakang Java / C ++. Dalam situasi tersebut, distribusi sangat mudah. Dengan python, saya, benar-benar bingung tentang semua sistem distribusi ini.
Raffi Khatchadourian
75
Saya setuju, pengemasan / instalasi Python memiliki terlalu banyak alternatif tanpa panduan yang jelas dari komunitas.
Sabuncu
6
Aku hanya ingin menghubungkan info terkait ini pada pip tidak mendukung distribusi biner lucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere
pixelbeat
@pixelbeat pip mendukung pemasangan roda (disebut distribusi biner), tautan itu sudah ketinggalan zaman.
Flimm

Jawaban:

836

Pada Maret 2020, sebagian besar jawaban lain untuk pertanyaan ini beberapa tahun kedaluwarsa. Ketika Anda menemukan saran tentang masalah pengemasan Python, ingatlah untuk melihat tanggal publikasi, dan jangan percayai informasi yang ketinggalan zaman.

The Python Panduan Kemasan Pengguna adalah layak dibaca. Setiap halaman memiliki tanggal "pembaruan terakhir" yang ditampilkan, sehingga Anda dapat memeriksa kebaruan manual, dan ini cukup komprehensif. Fakta bahwa itu di-host di subdomain python.org dari Python Software Foundation hanya menambah kepercayaan untuk itu. The Project Ringkasan Halaman ini terutama relevan di sini.

Ringkasan alat:

Berikut ringkasan lanskap kemasan Python:

Alat yang didukung:

Alat yang ditinggalkan / ditinggalkan:

  • distributeadalah garpu setuptools. Ini berbagi namespace yang sama, jadi jika Anda telah Mendistribusikan diinstal, import setuptoolssebenarnya akan mengimpor paket yang didistribusikan dengan Mendistribusikan Mendistribusikan digabung kembali ke Setuptools 0.7 , jadi Anda tidak perlu menggunakan Mendistribusikan lagi. Bahkan, versi pada Pypi hanyalah lapisan kompatibilitas yang menginstal Setuptools.

  • distutils2adalah upaya untuk mengambil yang terbaik dari distutils, setuptoolsdan distributedan menjadi alat standar yang termasuk dalam perpustakaan standar Python. Idenya adalah bahwa distutils2akan didistribusikan untuk versi Python lama, dan itu distutils2akan diubah namanya menjadi packaginguntuk Python 3.3, yang akan memasukkannya ke dalam perpustakaan standarnya. Namun, rencana ini tidak berjalan sebagaimana mestinya, dan saat ini, distutils2merupakan proyek yang ditinggalkan . Rilis terbaru adalah pada bulan Maret 2012, dan beranda Pypi akhirnya diperbarui untuk mencerminkan kematiannya.

Lainnya:

Ada alat lain, jika Anda tertarik, baca Ringkasan Proyek di Panduan Pengguna Kemasan Python. Aku tidak akan daftar mereka semua, untuk tidak mengulangi halaman tersebut, dan untuk menjaga jawaban yang cocok dengan pertanyaan, yang hanya sekitar distribute, distutils, setuptoolsdan distutils2.

Rekomendasi:

Jika semua ini baru bagi Anda, dan Anda tidak tahu harus mulai dari mana, saya akan merekomendasikan belajarsetuptools , bersama pipdan virtualenv, yang semuanya bekerja dengan sangat baik bersama.

Jika Anda melihat ke dalam virtualenv, Anda mungkin tertarik pada pertanyaan ini: Apa perbedaan antara venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, dll? . (Ya, aku tahu, aku mengerang bersamamu.)

Flimm
sumber
2
@makeramen: Lihat utas ini di milis .
Flimm
6
Dan tidak terlihat lebih baik: 'Distribute' is a now deprecated fork of the 'Setuptools' project.@ PyPI Bagikan halaman.
KurzedMetal
3
@KurzedMetal, menurut orang-orang SetupTools, setuptools 0.7 akan mencakup distribusi dan setuptools lama memulihkan ketertiban ke alam semesta. Jadi semuanya benar-benar diatur untuk meningkatkan secara signifikan!
John McDonnell
8
The Python Kemasan Panduan Pengguna akan memiliki up-to-date info paling atas keadaan kemasan python. Itu dicatat oleh Nick Coughlan di PyCon 2013 .
imanuelcostigan
1
@ Flimm Suntingan terakhir cukup lama. Apakah Bento sudah matang sekarang?
Martin Thoma
251

Saya seorang pengelola distutils dan kontributor distutils2 / packaging. Saya melakukan pembicaraan tentang kemasan Python di ConFoo 2011 dan hari ini saya menulis versi panjangnya. Ini belum diterbitkan, jadi di sini adalah kutipan yang seharusnya membantu mendefinisikan sesuatu.

  • Distutils adalah alat standar yang digunakan untuk pengemasan. Ini bekerja dengan baik untuk kebutuhan sederhana, tetapi terbatas dan tidak mudah untuk diperluas.

  • Setuptools adalah proyek yang lahir dari keinginan untuk mengisi fungsionalitas distutils yang hilang dan menjelajahi arah baru. Dalam beberapa subkomunitas, ini adalah standar de facto . Menggunakan monyet-patching dan sihir yang disukai oleh pengembang inti Python.

  • Distribute adalah fork dari Setuptools yang dimulai oleh pengembang merasa bahwa kecepatan pengembangannya terlalu lambat dan tidak mungkin untuk mengembangkannya. Perkembangannya sangat melambat ketika distutils2 dimulai oleh kelompok yang sama. Pembaruan 2013-Agustus: mendistribusikan digabung kembali ke setuptools dan dihentikan.

  • Distutils2 adalah perpustakaan distutils baru, dimulai sebagai garpu dari basis kode distutils, dengan ide-ide bagus diambil dari alat setup (yang beberapa di antaranya dibahas secara mendalam dalam PEPs), dan installer dasar yang terinspirasi oleh pip. Nama sebenarnya yang Anda gunakan untuk mengimpor Distutils2 ada packagingdi pustaka standar Python 3.3+, atau distutils2dalam 2.4+ dan 3.1-3.2. (Backport akan segera tersedia.) Distutils2 tidak membuat rilis Python 3.3, dan itu ditahan.

Info lebih lanjut:

Saya berharap untuk menyelesaikan panduan saya segera, itu akan berisi lebih banyak info tentang poin kuat dan lemah setiap perpustakaan dan panduan transisi.

Éric Araujo
sumber
1
Tidak. Distutils2 mengambil beberapa ide bagus dari setuptools / mendistribusikan, setelah standardisasi (PEPs) atau tidak (misalnya, saya membimbing seorang siswa GSoC yang menambahkan perintah pengembangan dan pembuatan skrip otomatis), tetapi itu tidak akan pernah menjadi drop-in penggantian: ada beberapa bagian yang tidak kita inginkan (telur, integrasi VCS, dll.). OTOH, distutils2 memiliki beberapa hal yang belum disetup / didistribusikan oleh setuptools. Untuk memudahkan transisi, saya pikir pengembang distribusi mungkin akan menggunakan distutils2 untuk mendukung standar dan alat baru; Saya juga berpikir saya ingat pengembang setuptools mengatakan bahwa dia ingin mendukung standar baru.
Éric Araujo
1
Di mana ez_setup termasuk dalam semua ini? Juga ada pembaruan status distutils2?
James McMahon
2
@ ÉricAraujo Maaf mendengar tentang keterlambatan ini. Saya sangat berharap ini sudah siap untuk 3.4! Saya suka Python, tetapi kemasannya selalu membuat saya membenturkan kepala ke dinding. (Dalam berita lain, bagaimana pemandu Anda akan datang? Jika sudah selesai, dapatkah Anda menautkannya dengan jawaban Anda di atas?)
Zearin
9
@AlexisHuet Komentar semacam ini akan lebih baik jika berisi tautan ke komentar di bawah ini (yang bisa Anda dapatkan dari sharetombol).
erikbwork
2
Anda mungkin harus memperbarui jawaban untuk menyebutkan yang distributebaru saja digabungkan kembali setuptools. Fakta bahwa banyak informasi di luar sana ketinggalan jaman menambah kebingungan
Amro
5

CATATAN: Jawaban sudah usang, Bagikan sekarang sudah usang. Jawaban ini tidak lagi berlaku sejak Otoritas Pengemasan Python dibentuk dan telah melakukan banyak pekerjaan untuk membersihkannya.


Ya, Anda mengerti. : -o Saya kira saat ini paket yang disukai adalah Distribute , yang merupakan garpu dari setuptools, yang merupakan perpanjangan dari distutils (sistem pengemasan asli). Setuptools tidak dipertahankan sehingga telah bercabang dan diganti namanya, namun ketika diinstal menggunakan nama paket setuptools! Saya pikir sebagian besar pengembang Python sekarang menggunakan Distribute, dan saya dapat mengatakan dengan pasti bahwa saya melakukannya.

Keith
sumber
Sebagai catatan, saya menerima jawaban ini karena memberi tahu saya situasinya sekarang (dan pertanda adalah perpanjangan hubungan yang tidak disebutkan oleh gambar di jawaban lain). Dan di suatu tempat di sepanjang jalan saya juga belajar bahwa dokumentasi itu sendiri biasanya tidak yakin apa yang ingin dikatakan.
VPeric
2
@VPeric, Memang, dokumentasi mencerminkan fakta bahwa aspek python ini dalam keadaan fluks / berantakan.
juanchopanza
2

Saya menyadari bahwa saya telah menjawab pertanyaan sekunder Anda tanpa menanggapi asumsi yang tidak dipertanyakan dalam masalah awal Anda:

Saya mencoba untuk port perpustakaan open-source (SymPy, jika ada yang bertanya-tanya) ke Python 3. Untuk melakukan ini, saya perlu menjalankan 2to3 secara otomatis ketika membangun untuk Python 3.

Anda mungkin , tidak perlu . Strategi lain dijelaskan di http://docs.python.org/dev/howto/pyporting

Untuk melakukan itu, saya perlu menggunakan distribusi,

Anda boleh :) distutils mendukung konversi kode 2to3 waktu-bangun (bukan dokumen), dengan cara berbeda yang mendistribusikan: http://docs.python.org/dev/howto/pyporting#during-installation

Éric Araujo
sumber
Terima kasih, meskipun kami telah memutuskan untuk menyelesaikan masalah dengan menulis skrip kami untuk menangani konversi. Dan ya, saya tahu ada pilihan lain selain menggunakan 2to3, tetapi SymPy adalah basis kode yang kompleks (sekitar 200k + baris terakhir kali saya periksa) dan menggunakan 2to3 adalah satu-satunya strategi realistis. Sekali lagi terima kasih!
VPeric
2

Memperbarui pertanyaan ini pada akhir 2014 di mana untungnya kekacauan pengemasan Python telah sangat dibersihkan oleh manajer paket " conda " Continuum .

Secara khusus, conda dengan cepat memungkinkan penciptaan " lingkungan " conda . Anda dapat mengonfigurasi lingkungan Anda dengan berbagai versi Python. Sebagai contoh:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

akan membuat dua lingkungan Python ("py34" atau "py26") dengan versi Python yang berbeda.

Setelah itu Anda dapat memanggil lingkungan dengan versi khusus Python dengan:

source activate <env name>

Fitur ini tampaknya sangat berguna dalam kasus Anda di mana Anda harus berurusan dengan versi Python yang berbeda.

Selain itu, conda memiliki fitur berikut:

  • Agnostik Python
  • Lintas platform
  • Tidak ada hak istimewa admin diperlukan
  • Manajemen ketergantungan cerdas (melalui pemecah SAT)
  • Baik berurusan dengan perpustakaan tingkat C, Fortran dan sistem yang Anda mungkin harus terhubung

Poin terakhir itu sangat penting jika Anda berada di arena komputasi ilmiah.

Julien Chastang
sumber