setuptools ve distutils: distutils neden hala bir şey?


143

Python projeleri paketlemek ve tanımlamak için kullanılabilecek bir araç kafa karıştırıcı bir geçmişi vardır: bunlar arasında distutils, Standart Kitaplığı'nda distribute, distutils2ve setuptools(ve belki de daha fazla). Öyle görünüyor distributeve distutils2lehine devam edildi setuptools, bu da iki rakip standart bırakıyor.

Anladığım setuptoolskadarıyla distutils, Python standart kütüphanesine (henüz?) Dahil edilmediğinden çok daha fazla seçenek sunuyor (örn. Bağımlılıkları, testleri vb . Beyan etmek).

Python Ambalaj Kullanım Kılavuzu [ 1 ] artık tavsiye eder:

setuptoolsProjeleri tanımlamak ve Kaynak Dağıtımlar oluşturmak için kullanın .

Ve açıklar:

distutilsBirçok proje için saf kullanabilmenize rağmen , diğer projelere bağımlılıkları tanımlamayı desteklemez ve paket meta verilerini otomatik olarak sağlanan doğru meta dosyası doldurmak için çeşitli kolaylık yardımcı programlarından yoksundur setuptools. Standart kitaplığın dışında olan setuptools, Python'un farklı sürümlerinde daha tutarlı bir özellik sunar ve (aksine distutils), setuptoolsdesteklenen tüm sürümlerde yaklaşan "Metadata 2.0" standart biçimlerini üretmek için güncellenir.

distutilsKullanmayı seçen projeler için bile , pip bu tür projeleri doğrudan kaynağından yüklediğinde (önceden oluşturulmuş bir tekerlek dosyasından yüklemek yerine), bunun setuptoolsyerine projenizi oluşturacaktır .

Ancak, çeşitli projenin setup.py dosyalarına bakıldığında bunun gerçek bir standart olmadığı görülmektedir. Birçok paketler hala kullanmaya distutilsve destek olanlar olduğu setuptoolssık sık karıştırın setuptoolsile distutilsbir geri dönüş ithalat yaparak ör:

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

Ardından, hem setuptoolsve tarafından yüklenebilecek bir kurulum yazmanın bir yolunu bulma girişimi distutils. Bu distutils, kurulum işlevindeki bağımlılıkları desteklemediğinden , genellikle hataya açık bağımlılık kontrolünün çeşitli yollarını içerir .

İnsanlar neden hala destek için ekstra çaba sarf ediyor distutils- setuptoolstek neden standart kütüphanede olmayan gerçek mi? Avantajları nelerdir distutilsve yalnızca destekleyen setup.py dosyalarını yazmanın herhangi bir dezavantajı vardır setuptools.


4
distutilsyeniden birleştirildisetuptools , ancak kullanmak için yazılan eski uygulamalar var distutilsve standartlara geçmek için gereken maliyetler var.
metatoaster

3
"Görünüşe göre dağıtım ve dağıtım 2 kurulum araçları lehine durduruldu", doğru, dağıtım sadece şimdi kurulum araçları için bir sarıcı ve distutils2 öldü.
kay - SE kötülük

1
setuptoolsgeliştirilmiş bir alternatif olduğunu distutils"olduğunu ancak not tavsiye edilen pip yükleyici ile tüm setup.py komut dosyalarını çalıştırır setuptoolsbile yazısının kendisi yalnızca ithalat,distutils (" kaynak )
user2314737

Yanıtlar:


77

Bu SO sorusuna bir göz atın. Tüm paketleme yöntemlerini çok iyi açıklar ve sorunuzun bir dereceye kadar yanıtlanmasına yardımcı olabilir: Dağıtım, dağıtım araçları, kurulum araçları ve dağıtım kutuları arasındaki farklar2?

Distutils hala Python'da paketleme için standart bir araçtır. Standart kütüphaneye dahildir (Python 2 ve Python 3.0 ila 3.3). Basit Python dağıtımları için yararlıdır, ancak özellikleri yoktur. Setup.py betiğinize aktarılabilen Python paketini tanıtır.

Setuptools , Distutils'in sınırlamalarının üstesinden gelmek için geliştirildi ve standart kütüphaneye dahil edilmedi. Easy_install adlı bir komut satırı yardımcı programı tanıttı. Ayrıca, setup.py komut dosyanızda içe aktarılabilen setuptools Python paketini ve bir dağıtımla yüklenen veri dosyalarını bulmak için kodunuza alınabilen pkg_resources Python paketini tanıttı. Gotchaslarından biri, Python paketinin maymun yamalarıdır. Pip ile iyi çalışmalıdır. En son sürüm Temmuz 2013'te piyasaya sürüldü.

Gördüğünüz gibi, kurulum araçları distutils'e tercih edilmelidir ve sorunuzun nereden geldiğini görüyorum, ancak distutils'in yakında destek kaybedeceğini görmüyorum, çünkü basitçe söylemek gerekirse, bazı popüler eski programlarla kullanılıyor . Muhtemelen bildiğiniz gibi, eski programlarda bu tür şeyleri değiştirmek oldukça acı verici olabilir ve örneğin uyumsuzluklar gibi birkaç sorunla birlikte gelebilir, bu da geliştiricinin kaynak kodunu yeniden yazmasına neden olur. Yani, ve ayrıca distutils'in standart python kütüphanesinin bir parçası olduğu, ancak setuptools olmadığı gerçeği. Yani, bir python programı oluşturuyorsanız, bu gün ve yaşta setuptools'u kullanın, ancak distutils olmadan setuptools'un asla olmayacağını unutmayın.


3
"Distutils hala Python paketleme için standart bir araçtır." Python Ambalaj Kullanım Kılavuzu ile çelişmektedir.
cel

1
Buna inanmıyorum, kurulum araçlarının standart olduğunu açıkça söylüyor mu ? Ayrıca, bu ifadenin sağladığım web sitesinden alıntılandığını unutmayın, bu yüzden bunlar benim sözlerim değil. Bununla birlikte, diğer birçok insan arasında hemfikir olduğum bir görüş.

Topluluk sana katılıyor gibi göründüğü için sana ödül verdim. Ne yazık ki bu soru alacağı kadar ilgi görmedi.
cel

easy_install, kurulum araçlarını reddetmemizin ana nedenidir - onu kullanan paketler için benim için büyük bir sorun kaynağı oldu (sadece yeniden paketlemek daha kolay). Diğer özellikler tamam.
Stuart Gathman

14

tek neden kurulum araçlarının standart kütüphanede olmamasıdır

Bu bir sebep. Aşağıdakiler doğrudan NumPy'den alınmıştırsetup.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

Bu yüzden NumPy setuptoolsbulabilirse onu tercih eder . O kadar Ama sonra scipy Bunu yapmak için kullanılan yamalı tercih distutilsbazı durumlarda. İşlem günlüğüne atıf:

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

Tabii ki, bir birleşme arasında setuptoolsve distributezamanında tüm bu çözmelidir, ancak birçok paketler hala Python 2.6 yüklemelerini desteklemek gerekir.


1
distributebir çataldı setuptoolsve şimdi birleştirildi.
R4444

10

Setuptools şüphesiz daha iyi bir araç seti olsa da, yine de konuştuğumuz ve distutils kullandığımız birkaç neden var.

İlk olarak, her yerde dağıtım noktaları mevcuttur. Başkalarıyla paylaşmak için bir modül oluşturmak istiyorsanız ve herhangi bir karmaşık gereksiniminiz yoksa, iş makinenizde kullanılabileceği garanti edilir. Bu, özellikle python'un eski sürümlerini desteklemeniz gerekiyorsa veya kendinizi yabancı bir ortamda çalışırken bulursanız önemlidir.

İkinci olarak, setuptools, dağıtımcılara geliştirmeler sağlar. Bu nedenle, distutils araç setinden sonra modellenir ve tüm yapısını oradan alır. Setuptools belgeleri, okuyucunun dağıtım bilgisine aşina olduğunu ve yalnızca temel araç setini nasıl geliştirdiğini belgelediğini varsayar. Distutils'in lehçeyi tanımladığını ve setuptools'un bu lehçeyi geliştirdiğini düşünebilirsiniz.

Yeni projeler için kişisel yaklaşımım, ilki kullanacağım varsayımı ile başlıyor. Yalnızca proje büyüdükçe kurulum araçlarının bir özelliğini gerektirecek şekilde yükseltme yapıyorum. Setuptools, dağıtım dosyalarının yerini alan bir bırakma aracıdır, benim setup.py dosyamda tek satırlık bir değişikliktir.


Cevabınız için teşekkürler. Setuptools yüklemesi önyüklenebilir olduğundan, kullanılabilirlik argümanı bu kadar önemli olamaz. Distutils yeterli işlevsellik sağlıyorsa, onu kullanmanın mantıklı olduğunu görüyorum. Ancak, bence distutilleri ve kurulum araçlarını karıştırmak, kişinin hedeflerine ulaşmak için çok temiz bir yol değildir. Her ne kadar @larsmans, cevabında bazı görevler için distutils kullanmaya zorlayan kurulum araçlarında bazı zorluklar gösterdi.
cel

9

Temel olarak, sorumlulukların bölünmesinden kaynaklanmaktadır.

setuptoolsPython standart kütüphanesinin bir parçası değildir, çünkü Python çekirdek ekibi yerine üçüncü bir tarafça sürdürülür. Bu, diğer şeylerin yanı sıra:

  • çekirdek test takımı tarafından kapsanmaz ve temel işlevlerden etkilenmez
  • o değil kendisi eklenti modüllerinin (konumlarını, ithal yolu, C uzantıları ikili arayüz vs.) için temel standartlar.
  • Python sürümlerinden bağımsız olarak güncellenir ve yayınlanır

Etkili bir şekilde, çekirdek ekip, "temel standartlar" ve "gerekli minimum derleme" bölümlerini kendileri için ayırırken, diğer şeyleri (genişletilmiş derleyici / paket formatı / her türlü destek) 3. taraflara bırakarak , kendi alanlarını daralttı . Daha önce bu "uzatılmış parçaları" kapsayan kod geriye dönük uyumluluk için bayat bırakılmıştır .

Gönderen Dağıtma Python Modülleri - Python 2.7.12 belgeleri :

Doğrudan kullanımı distutilsaşamalı olarak kaldırılırken, halen mevcut paketleme ve dağıtım altyapısının temelini attı ve sadece standart kütüphanenin bir parçası olarak kalmıyor, aynı zamanda adı başka yollarla da (posta listesinin adı gibi) yaşıyor Python paketleme standartlarının geliştirilmesini koordine etmek için kullanılır).

Diğer işletim sistemlerine yönelik paketlerin de yukarıda belirtilen nedenlerden ötürü aynı şekilde setuptoolsve pipayrıca sağlanması muhtemeldir.

  • ve sistemde zaten başka bir paket yöneticisi olduğunda gerekli olmadıklarından (hatta sürdürülebilirlik için zararlı olduklarından).
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.