Pip vs Python Paketlerini kullanmak için Paket Yöneticisi


20

Python paketleri çoğu dağıtım havuzunda sıkça barındırılmaktadır. Bu öğreticiyi okuduktan sonra , özellikle “Gerçekten yapmak istiyor musunuz?” Başlıklı bölümü pip kullanmaktan kaçındım ve sistem deposunu kullanmayı tercih ettim, yalnızca depoda olmayan bir paket yüklemem gerektiğinde pip'e başvurdum.

Ancak, bu tutarsız bir yükleme yöntemi olduğundan, sadece pip kullanmak daha iyi olur mu? Her iki yerde de bulunan paketler için piponu sistemin kendi deposunda kullanmanın faydaları / detektörleri nelerdir?

Dahil ettiğim bağlantı devletler

Her zaman standart Debian / NeuroDebian paketlerini kullanmanın avantajı, paketlerin birbirleriyle uyumlu olması için dikkatlice test edilmesidir. Debian paketleri, diğer kütüphanelerle olan bağımlılıkları kaydeder, böylece kurulumun bir parçası olarak ihtiyacınız olan kütüphaneleri her zaman alırsınız.

Ben kemer kullanırım. Bu, apt dışında diğer paket yönetim sistemlerinde de geçerli midir?

Yanıtlar:


21

Sisteminize pipPython modüllerini kurmak için kullandığım en büyük dezavantaj , sistem modülleri veya kullanıcı modülleri olarak, dağıtımınızın paket yönetim sisteminin bunları bilmemesidir. Bu, onlara ihtiyaç duyan ve gelecekte kurmak isteyebileceğiniz başka bir paket için kullanılmayacakları (veya yükseltme sonrasında bu modüllerden birini kullanmaya başlayabilecekleri) anlamına gelir; daha sonra pipsorunlara yol açabilecek modüllerin hem - hem de dağıtım tarafından yönetilen sürümleriyle sonuçlanır ( yakın zamanda bunun başka bir örneğine rastladım ). Ya hep ya hiç bir uzlaşmadır olmak kadar soru uçları Yani: Size eğer sadece kullanımınıpip Python modülleri için, dağıtımınızın paket yöneticisini Python modülünü kullanmak isteyen hiçbir şey için kullanamazsınız ...

Bağlandığınız sayfada verilen genel tavsiye çok iyidir: dağıtımınızın paketlerini mümkün olduğunca kullanmaya çalışın, yalnızca pippaketlenmemiş modüller için kullanın ve bunu yaparken, kullanıcı kurulumunuzda bunu yapın; geniş. Özellikle ortam geliştirme için sanal ortamları mümkün olduğunca kullanın. Özellikle Arch'ta, eski modüllerin neden olduğu sorunlarla karşılaşmamalısınız; Bunun bir problem olabileceği dağıtımlarda bile, sanal ortamlar kolayca başa çıkabiliyor.

Bir dağıtımın kütüphane ve modül paketlerinin, öncelikle dağıtımdaki diğer paketlerin kullanımı için paketlendiğini göz önünde bulundurmak her zaman önemlidir; Onları bu kütüphaneleri ve modülleri kullanarak gelişimi için güzel bir yan etkisi var, ancak bu birincil kullanım durumu değil.


1
Bu ikilikle veya çelişkiyle sıkışıp kalmamız gerçekten talihsiz bir durum, belki de bunu Python ve resmi depolarda çözmek için çalışmalıyız
Cat

Kullanmama riski pip, yanlışlıkla pip uninstallyönetilen bir paketse ne olur ?
Mehrdad

@Mehrdad Vakaların çoğunda, pipkullanıcı olarak (bir sanalenv ile bağlantılı olarak) çalıştırırdınız ve bu nedenle sistem yüklü dosyaları karıştırmak için izniniz yoktur.
marcelm

1
@ marcelm: Sanırım bir Linux makinesiyseniz ve birileri size kullanmamayı öğrettiyseniz, sudo pipbelki (o zaman bile, herkesin kullandığını varsaydığınızda çok fazla varsayıyorsunuzdur virtualenv), ama örneğin MSYS2'yi kullanıyorum (Windows) Bunun sadece geçerli olmadığı yerde. Bir python paketi kurmak için iki seçeneğim var: pacmanve pip. Ne yüklemek için kullanılan aklımda tutmalıyım, çünkü yanlış olanı kullanmak bir şeyleri mahvedecektir.
Mehrdad

10

TL; DR

  • Kullanım pipşeyler (kütüphaneleri, çerçeveler, belki dev araçları) için (+ Virtualenv) Projeleriniz (siz geliştirdiğini) kullanımı
  • Paket yöneticisini kullandığınız uygulamalar için kullanın (son kullanıcı olarak)

Kalkınma bağımlılıkları

Python'da yazılım geliştiriyorsanız pip, projenin tüm bağımlılıkları için kullanmak isteyeceksiniz , bunlar çalışma zamanı bağımlılıkları, yapım zamanı bağımlılıkları veya otomatik testler ve otomatik uyumluluk kontrolleri için gerekli şeyler (linter, stil denetleyicisi, statik tip denetleyicisi) ...)

Bunun birkaç nedeni var:

  • Bu kullanmanızı sağlar Virtualenv (doğrudan veya virtualenvwrapper veya pipenv veya başka yollarla ya) birbirinden farklı projelerin bağımlılıkları ayırmak ve herhangi egzotik maskaralık sizi (bir kullanıcı olarak) "üretimde" kullanmak piton uygulamaları izole etmek (ya da gelişimine devam edebilecek bile olsa, sadece uyumsuzluklar bile).
  • Bu, bir projenin tüm bağımlılıklarını requirements.txt(projeniz bir uygulama ise) veya setup.py(projeniz bir kütüphane veya çerçeve ise) izlemenizi sağlar . Bu, kaynak kodla birlikte revizyon kontrolü (örn. Git) ile kontrol edilebilir, böylece kodunuzun hangi sürümünün bağımlılıklarınızın hangi sürümlerine dayandığını her zaman bilirsiniz.
  • Yukarıdakiler, aynı Linux dağıtımını kullanmasalar veya aynı işletim sistemini kullanmasalar bile, diğer geliştiricilerin projenizde işbirliği yapmalarını sağlar (eğer kullanılan bağımlılıklar Mac ve Windows'ta da mevcutsa veya ne olursa olsun kullanıldıysa)
  • İşletim sisteminizin paket yöneticisinin otomatik güncellemelerinin kodunuzu kırmasını istemiyorsunuz. Bağımlılıklarınızı güncellemelisiniz, ancak kodunuzu düzeltmek veya güncellemeyi geri almak için hazır olmanız için bilinçli ve seçtiğiniz zamanlarda yapmanız gerekir. (Revizyon kontrol sisteminizdeki tüm bağımlılık bildirimini kodunuzla birlikte izlerseniz kolaydır.)

Doğrudan ve dolaylı bağımlılıkları ayırmanız gerektiğine inanıyorsanız (veya bir bağımlılık için kabul edilebilir sürüm aralığı ile kullanılan gerçek sürüm arasındaki farkı ayırt edin, bkz. "Sürüm sabitlemesi") pip-tools ve / veya pipenv'e bakın. Bu aynı zamanda derleme ve test bağımlılıkları arasında ayrım yapmanıza izin verecektir. (Derleme ve çalışma zamanı bağımlılıkları arasındaki fark büyük olasılıkla kodlanabilir setup.py)

Kullandığınız uygulamalar

Normal uygulama olarak kullandığınız ve Python'da yazılmış olan şeyler için işletim sisteminizin paket yöneticisini tercih edin. Makul bir şekilde güncel kalmasını ve paket yöneticisi tarafından yüklenen diğer şeylerle uyumlu olmasını sağlar. Çoğu Linux dağıtımı, kötü amaçlı yazılım dağıtmadıklarını da söyler.

İhtiyacınız olan bir şey dağıtımınızın varsayılan paket deposunda mevcut değilse, ek paket repolarını (örneğin deb bazlı dağıtımların başlatılması) kontrol edebilir veya pipyine de kullanabilirsiniz . İkincisi ise, --usersistem genelinde kullanıcı evinize yüklemek için kullanın, böylece Python kurulumunuzu bozma olasılığınız azalır. (Sadece geçici veya nadiren ihtiyacınız olan şeyler için bir sanalenv bile kullanabilirsiniz.)


8

Paket yöneticisine gitmenin bir başka nedeni de, güvenlik açısından kritik olan güncellemelerin otomatik olarak uygulanacak olmasıdır. Equifax'ın kullandığı fasulye paketinin yum-cron-security aracılığıyla otomatik olarak güncellendiğini düşünün, kesmek olmayabilir.

Kişisel gelişim kutumda Pip kullanıyorum, prodüksiyonda paket kullanıyorum.


4
Hangi kullandığınız da üretim ayarlarınıza bağlıdır. Virtualenvs nedenden dolayı var :) Ayrıca dağıtımınıza bağlı olarak, güvenlik güncelleştirmeleri aslında pip'e bağlı kalmak için bir neden olabilir, çünkü paket yöneticileri yeni sürümler eklemek için yavaş olabilir.
Edward Minnix

7

Yazmakta olduğunuz kodda kullanmak için python paketleri kurmaktan bahsediyorsanız pip kullanın.

Üzerinde çalıştığınız her proje için sanal bir ortam oluşturun ve ardından projenin ihtiyaç duyduğu şeyleri yüklemek için pip kullanın. Bu şekilde, kullandığınız tüm kütüphaneleri tutarlı bir şekilde kurarsınız ve bunlar içerilir ve paket yöneticiniz aracılığıyla yüklediğiniz hiçbir şeyi engellemez.

Herhangi bir python kodunu serbest bırakmayı planlıyorsanız, tipik olarak, pip'in tüm bağımlılıklarını otomatik olarak alabilmesi için projenize bir setup.pyveya ekleyin requirements.txt. Bu proje için kolayca sanal bir ortam oluşturmanıza veya yeniden yaratmanıza izin vermek.


1

özet

Başa çıkacağınız üç genel modül kategorisi vardır:

  1. İşletim sistemi paket sistemine sahip tüm kullanıcılar için yüklü programları destekleyenler. (Bu, Python'da programlama yapan insanlar tarafından kullanılan araçları ve kütüphaneleri de içerebilir; aşağıya bakın.) Bunlar için yapabileceğiniz işletim sistemi paketlerini kullanır ve pipgerektiğinde sistem dizinlerine yüklersiniz.
  2. Belirli bir kullanıcı tarafından yalnızca kendi kullanımı için ve aynı zamanda Python'u "günlük" bir betik dili olarak kullanmasının belirli yönleri için kurulmuş programları destekleyenler. Bunlar için pip --userbelki pyenv veya pythonz ve benzer araçlar ve taktikler kullanıyor.
  3. Belirli bir uygulamanın geliştirilmesini ve kullanılmasını destekleyenler. Bunlar için virtualenv(veya benzer bir araç) kullanıyorsunuz.

Buradaki her seviye bir önceki seviyeden de destek alıyor olabilir. Örneğin, (2) 'deki kullanıcımız, işletim sistemi paketleriyle yüklenen bir Python yorumlayıcısına güveniyor olabilir.

Buna biraz daha detaylı bir şekilde girmek:

Sistem Programları ve Paketleri

Python'da yazılmış "sadece çalıştırmak" istediğiniz programlar kolaydır: işletim sistemi yükleme araçlarını kullanın ve ihtiyaç duydukları her şeyi getirmelerini sağlayın; Python olmayan bir programdan farklı değildir. Makinenizdeki kullanıcıların güvenmeye başlayabileceği Python araçlarını / kütüphanelerini (Python yorumlayıcısının kendisi gibi!) Getirmesi olasıdır; Bu, bağımlılığı anladıkları ve ideal olarak, bu bağımlılıkları sağlamayan ev sahiplerinde kullanmanın alternatif yollarını bildikleri sürece bir sorun değildir.

Böyle bir bağımlılığın yaygın ve basit bir örneği, ~/.local/bin/başlangıçtaki kişisel senaryolarımdan bazılarıdır #!/usr/bin/env python. Bunlar, RH / CentOS 7 ve çoğu (hepsi değil) Ubuntu'nun kurduğu (Python 2 altında çalıştığı sürece) iyi çalışacak; temel bir Debian kurulumunda veya Windows'ta olmazlar. Kişisel ortamımın işletim sistemi paketlerine bağımlılığı çok fazla sevmemesi (bir dizi farklı işletim sistemi üzerinde çalışıyorum) gibi, oldukça kabul edilebilir buluyorum; Python sistemi bulunmayan ve elde edilemeyen nadir bulunan ana bilgisayarlardaki yedekleme planım, aşağıda açıklandığı gibi bir Kullanıcı sistemiyle gitmektir.

Sistem piton tercümanı kullanan kişiler de genellikle sisteme bağımlıdır pip3. Bu, genellikle sistem bağımlılıklarımdaki çizgiyi çizdiğim yerle ilgilidir; her şeyden önce virtualenvkendimle uğraşıyorum. (Örneğin benim standart etkinleştirmek komut ne olursa olsun dayanıyor pip3veya pipyolda olmakla kendi kopyasını indirir virtualenvo yaratıyor sanal ortam bootstrap.

Bununla birlikte, bir geliştirme ortamından daha fazlasını elde etmenin makul derecede makul olduğu durumlar vardır. Sistemin sürümünü kullanmak istediğiniz Python arayüzleri (DBMS gibi) karmaşık paketlere sahip olabilir ve sistemin, konuşmak için kullanacağınız belirli Python kütüphane kodunu seçmesine izin vermenin en iyisi olduğunu düşünebilirsiniz. Veya bir Python sınıfı için temel geliştirme ortamına sahip birçok ana bilgisayarı dağıtabilir ve standart sistem paketleriyle otomatikleştirmenin en kolay yolunu bulabilirsiniz.

Kullanıcı "Günden Güne" Programlar ve Paketler

Kullanıcılar, sanal bir ortama tam olarak uymayan Python kitaplıklarına veya programlarına sahip olabilir, çünkü ilk başta sanal ortamlar oluşturmaya yardımcı olmak istiyorlar (örneğin, sanalenvwrapper ) veya komut satırından sıkça kullandığınız şeylerdir. Python dışı iş yapıyorum. Bunların sistem versiyonlarını kurma kabiliyetleri olsa bile, kendi kurulumlarını daha rahat hissedebilirler (örneğin, aracın en son versiyonunu ve bağımlılıklarını kullanmak istedikleri için).

Genellikle pip --userinsanlar bunun için kullanacaklardır, ancak Python yorumlayıcısının kendisi gibi bazı bağımlılıklar bundan biraz daha fazlasını gerektirir. pyenv ve pythonz , kişisel tercümanlar oluşturmak için kullanışlıdır ( ~/.local/binvarsayılan tercüman olarak takılı olsun ya da olmasın ), ve elbette, kişi, kişi kitaplıkları mevcutsa her zaman kaynaktan "elle" inşa edebilir.

Burada kurulu minimum ürün setini tutmaya çalışıyorum: virtualenvwrapper (sürekli kullanıyorum çünkü) ve belki de en yeni pip sürümü. Birçok kütüphanede kullanılmak üzere yazdığım kişisel scriptler için standart kütüphane dışındaki veya Python 3'teki bağımlılıkları önlemeye çalışıyorum. (Bu kişisel senaryoların çoğunu Python'a taşırken ne kadar süre dayanabileceğimizi görelim.)

Ayrı Uygulama Geliştirme ve Çalışma Zamanı Ortamları

Bu her zamanki sanalenv olayıdır. Geliştirme için, sistem bağımlılıklarını kullanmadığınızdan emin olmak için neredeyse her zaman bir sanalenv kullanmalısınız ya da farklı Python sürümlerine karşı test etmek için birden fazla kullanmalısınız.

Bu sanal ortamlar, kullanıcı ortamınızı kirletmekten kaçınmak istediğiniz birçok bağımlılığı olan uygulamalar için de iyidir. Örneğin, genellikle Jupyter notebook ve benzerlerini çalıştırmak için sanal bir aygıt kurdum .

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.