Setup.py'deki pip gereksinimleri dosyası yerine install_requires dosyası ne zaman kullanılır?


94

Bazı Python kitaplıklarını paketlemek ve yüklemek için virtualenv ile pip kullanıyorum.

Yaptığım şeyin oldukça yaygın bir senaryo olduğunu hayal ediyorum. Bağımlılıklarını açıkça belirleyebileceğim birkaç kitaplığın bakımcısıyım. Kütüphanelerimden birkaçı, üzerinde kontrolüm olmayan geçişli bağımlılıkları olan üçüncü taraf kitaplıklara bağımlı.

Başarmaya çalıştığım şey, pip installkütüphanelerimden birinin tüm yukarı akış bağımlılıklarını indirmesi / yüklemesidir. Pip dokümantasyonunda uğraştığım şey, gereksinim dosyalarının bunu kendi başlarına yapıp yapamayacakları / nasıl yapabilecekleri veya gerçekten kullanmanın bir eki olup olmadıklarıdır install_requires.

Kullandığım misiniz install_requiresbir çatışmayı çözmek ve / veya üretim yapı için bunları dondurmak için bağımlılıkları ve sürüm aralıklarını belirlemek için benim kütüphanelerin hepsi ve daha sonra sadece bir gereklilik dosyasını kullanmak?

Hayali bir dünyada yaşadığımı varsayalım (biliyorum, biliyorum) ve yukarı akış bağımlılıklarım basittir ve asla çatışmayacak veya geriye dönük uyumluluğu bozmayacaktır. Bir pip gereksinimleri dosyası kullanmaya mecbur kalacak mıyım yoksa sadece pip / setuptools / distribute'un her şeyi temel alarak yüklemesine izin verecek install_requiresmiyim?

Burada pek çok benzer soru var, ancak birini veya diğerini ne zaman kullanacağım veya ikisini birlikte uyumlu bir şekilde kullanacağım kadar basit bir soru bulamadım.


3
Bu , ikisinin ilişkisini ve nasıl bütünleştiklerini açıklayan çok güzel bir makale.
Björn Pollex

Yanıtlar:


68

Benim felsefem, install_requiresihtiyacınız olan şeylerin minimum bir kısmını belirtmek. Bazı sürümlerin çalışmayacağını biliyorsanız sürüm gereksinimlerini içerebilir ; ancak emin olmadığınız durumlarda sürüm gereksinimleri olmamalıdır (örneğin, bir bağımlılığın gelecekteki bir sürümünün kitaplığınızı bozup bozmayacağından emin değilsiniz).

Öte yandan gereksinimler dosyaları , işe yaradığını bildiğiniz şeyleri belirtmelidir ve önerdiğiniz isteğe bağlı bağımlılıkları içerebilir. Örneğin, SQLAlchemy'yi kullanabilir, ancak MySQL'i önerebilirsiniz ve bu nedenle MySQLdb'yi gereksinimler dosyasına koyun).

Yani özetle: install_requiresİnsanları işe yaramadığını bildiğiniz şeylerden uzak tutmak, gereklilik dosyaları ise insanları işe yaradığını bildiğiniz şeylere yönlendirmektir. Bunun bir nedeni, install_requiresgereksinimlerin her zaman kontrol edilmesi ve paket meta verilerini gerçekten değiştirmeden devre dışı bırakılamamasıdır. Böylece yeni bir kombinasyonu kolayca deneyemezsiniz. Gereksinim dosyaları yalnızca yükleme sırasında kontrol edilir.


5
bu, setup.py install_requires=dep'leri yansıtmanız gerektiği anlamına mı geliyor requirements.txt?
2013

9
Her ikisine de sahip olmak, setup.py'deki gereksinimlere ve bir gereksinimler dosyasına sahip olmak tehlikelidir, çünkü çoğaltma sadece senkronizasyon dışı kalmayı ister.
Sebastian blask

1
Ayrıca, o zaman onunla gerçekten nasıl çalışıyorsunuz? Kesinlikle çalışan bir duruma ulaşmak için gereksinimler dosyasını bir kez kullandığınızı varsayıyorum. Ardından pip ile gerçek paket ile kurun. Asla kullanamayacaksınız -Uçünkü bu, gereksinimler dosyasındaki bağımlılıkları geçersiz kılabilir mi? Nasıl yükseltirsiniz?
Sebastian Blask

1
Bu cevap, uygulamalar ve paketler için aynı ölçüde geçerli mi? My-web-app'ı (bir uygulama), her ikisi de istek paketine bağlı olan bir araca (bir paket) bağlı olarak hayal edin. Bir aracın, belirli bir sürümü veya sürüm aralığını sabitleyen bir gereksinimler.txt dosyası varsa, bu, benim web uygulamam için çakışan bir sürüm / sürüm aralığı belirtmiş olabilecek olası bir sorun yaratır.
Reece

2
Bir paketi kurmanın tek yolu olmalı. Dolayısıyla, diğer katılımcıların kafasını karıştırmak istemediğiniz sürece her ikisine de sahip olmanız önerilmez.
Gewthen

18

setup.py'ye koyduğum şey şu:

# this grabs the requirements from requirements.txt
REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]

setup(
    .....
    install_requires=REQUIREMENTS
)

20
Dikkat edin, gereksinim dosyaları yorumlar ve eklemeler içerebilir. Pip ayrıştırıcısını kullanmalısınız
Romain Hardouin

1
evet, sonunda yorumları çıkarmak için bunu değiştirdim. pip ayrıştırıcı cevabımdan daha iyi görünüyor.
rbp

7
Tüm içeriği zaten setup.py içindeyse, neden bir gereksinimler dosyası kullanasınız?
Sebastian Blask

2
@RomainHardouin, bağlantılı cevabınıza yapılan yorumlarda belirtildiği gibi, pip bu şekilde kullanılmak üzere tasarlanmamıştır.
akaihola

1
evet bu --extra-index-url, gereksinimlerde kritik bir giriş gerekene kadar benim için çalıştı ve bu yüzümde patladı. Teşekkürler @RomainHardouin
Tommy

12

Python Paketleme Kullanıcı Kılavuzunda bu konuyla ilgili bir sayfa var, kesinlikle okumanızı tavsiye ederim:

Özet:

install_requirespaketin çalışması için mutlaka yüklenmesi gereken paketin bağımlılıklarını listelemek için var mı? Bağımlılıkları belirli sürümlere sabitlemek anlamına gelmez, ancak örneğin aralıklar kabul edilir install_requires=['django>=1.8']. ve diğer araçlar install_requirestarafından gözlemlenir pip install name-on-pypi.

requirements.txtsadece bir metin dosyasıdır ve çalıştırmayı seçebilirsiniz pip install -r requirements.txt. Böyle, sabitlenmiş bütün bağımlılıkları ve subdependencies sürümlerini olması gerekiyordu var: django==1.8.1. Kullanarak bir tane oluşturabilirsiniz pip freeze > requirements.txt. (Heroku gibi bazı hizmetler pip install -r requirements.txtsizin için otomatik olarak çalışır .) Sadece pip install name-on-pypibakmaz .requirements.txtinstall_requires


5

Ben sadece hiç bir kullanma setup.pyve install_requiresbakmak için tek bir yer olduğu için. Bir gereksinimler dosyasına sahip olmak kadar güçlüdür ve sürdürülecek çoğaltma yoktur.


Soru, birini veya diğerini ne zaman kullanacağımdır, onu heceleyemedim, ama cevabım, her zaman birini kullanıyorum, diğerini asla kullanmadığımı söylüyor. Bu nasıl soruya cevap vermiyor?
Sebastian Blask
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.