2017-02-15 58 views
7

Desteklenmeyen bir Python sürümü kullanıldığında pip'in toplanmasını ve paket yüklemeyi denemesini önlemek için setup.py dosyasına ne yazabiliriz? Örneğin magicstack içinPaketin eski Python sürümlerine yüklenmesini önleme

hazinesi sınıflandırıcı ile listelenen bir projedir:

yüzden pip --version eğer aşağıdaki davranış 2.7 python bağlıdır bekliyoruz
Programming Language :: Python :: 3 :: Only 

:

$ pip install magicstack 
Collecting magicstack 
    Could not find a version that satisfies the requirement magicstack (from versions:) 
No matching distribution found for magicstack 

Ama gerçek davranışlar olmasıdır pip bir sürüm toplar, indirir, yüklemeye çalışır ve başarısız olur. Örneğin Python 3'e özgü diğer Python3 sürümleri, curio, setup.py, Python 3'e özgü bir şey kullanmadığından, yalnızca bazı Python 3 sözdizimi kullanıldığında içe aktarma zamanında başarısız olur. Ve eminim ki, Tamam'ı yükleyen, Tamam'ı yükleyen ve belki sadece çalışma zamanında başarısız olan paketler var!

Desteklenen Python sürümlerinizi, piplerin saygı gösterecek şekilde belirtmek için doğru yöntem nedir? Yalnızca bir teker dosyası yükleyerek ve bir .tar.gz dağıtımını yüklemeyi reddeden bir geçici çözüm buldum, ancak doğru düzeltmeyi öğrenmek isterim.


Düzenleme: nasıl pipdeğil biliyor Python/os/mimari eşleşen değilse tekerlek dağılımını indirmek için? Sadece .whl filename convention mu kullanıyor yoksa sahnelerin gerisinde olduğundan daha karmaşık bir şey var mı? Bir şekilde meta verisinin pip verisini .tar.gz yüklemeleri ile doğru şeyi yapmasını sağlamak için verebilir miyiz?

+0

Bunun _right_ yanıtı olduğunu bilmiyorum ... ama eğer 'setup.py' python2.x'de başarısız olmasından dolayı' magicstack' python3 ise, o zaman bu işin yapılması için mümkün olan tek bir yol gibi görünüyor. 'setup.py', uygun olmayan python sürümlerinde başarısız olmaya zorlar ... – mgilson

+0

Hacky. Pip desteklenmeyen bir Python yorumlayıcısına bağlıysa, 'setup.py' çalıştırılarak bir yükleme girişiminde bulunulsun, paketin toplanmasını veya indirilmesini istemiyorum. – wim

+0

Google, bazı [önceki] (http://stackoverflow.com/questions/13924931/setup-py-restrict-the-allowable-version-of-the-python-interpreter) [soruları] (http: // stackoverflow) .com/questions/13385337/distribution-distutils-modify-python-version) 'setup.py' komutunun Python sürümüne sahip olduğunu söyleyen cevaplarla. – user2357112

cevap

3

Bunu yapmak için doğru bir yol var, ama ne yazık ki pip sadece 9.0.0 sürümünde (2016-11-02 yayınlandı) desteklemeye başladı ve böylece daha eski sürümleri olan kullanıcılar willy-nilly paketlerini indirmeye devam edecekler Python sürümünün ne için olduğuna bakılmaksızın. senin setup.py dosyasında

, setup() bir PEP 440version specifier olarak paketin desteklenen Python sürümleri listeleyen bir python_requires argüman geçmektedir. paketiniz yalnızca 3+ Python için ise Örneğin, yazın:

setup(
    ... 
    python_requires='>=3', 
    ... 
) 

paketiniz Python 3 için ise.Paket Python 2.6, 2.7 içinse

setup(
    ... 
    python_requires='~=3.3', 
    ... 
) 

ve Python 3 tüm sürümleri 3.3 ile başlayarak, yazma: 3 ve yukarı ama 4 desteği henüz Python işlemek için istekli değiliz yazma

Ve benzeri.

Bunu yaptıktan sonra, python_requires bağımsız değişkeninin işlenebilmesi için, setuptools sürümünüzü en az 24.2.0 sürümüne yükseltmeniz gerekir; önceki sürümler bir uyarı ile göz ardı eder. Daha sonra projenizin tüm sdistleri ve tekerlekleri daha sonra PyPI'ye Python sürümlerinin ne için olduklarını pip söylemesini söyleyen ilgili meta verileri içerecektir.

+0

Merhaba, güncelleme için teşekkürler. Çözümünüzü denedim, ancak beklendiği gibi çalışmıyor. Setuptools'u v34.3.2'ye güncelledim ve 'python_requires' kwarg'ını kullanarak yeni dağıtımlar yükledim. Python 3.6 üzerinde 9.0.1 pip sürümü ile, davranış ** doğrudur ** (pip, dağıtımı indirmeyi/yürütmeyi reddeder ve gerekli/gerçek python versiyonlarını basar). Ancak Python 2.7 üzerinde 9.0.1 pip sürümünü kullanarak, yanlış - dağıtım indirilir ve 'setup.py' çalıştırılır. İlgili meta veriler var (pip3 için çalıştığı için) ama pip2 tarafından yok sayılıyor. Bir şey mi eksik? – wim

+0

@wim: "python_requires" için hangi sürüm belirticisini kullandınız? – jwodder

+0

Meta verilere kısıtlamayı uygulamak için python_requires> = '3.6.1' 'kullandım ve 3.6.0 ve 2.7.5'teki sanal ortamları kullanarak pip 9.0.1'i test ettim. – wim

1

pypi üzerinde magicstack dağıtımı bozuk. Kaynak dağıtımı için setup.py olsa bile kaynak dağıtımı magicstack paket içermediğinden başarısız oluyor.

sürece pypi bir kaynak dağılımını (örneğin .tar.gz, .zip) içerdiğinden, pip indirir o piton/os/mimarlık sürümü için bir eşleştirme ikili dağılımını (örneğin .egg, .whl) bulamazsa.

Seçenekleriniz, yalnızca ikili paketlere izin verilse bile, pypi'ye (tercihen wheels) yalnızca ikili dağıtımları yüklemeniz yeterlidir. Diğer seçenek, uyumlu sürümler için setup.pysys.version kontrol etmek ve aksi halde bir istisna yükseltmektir.

+0

Sadece ikili dağıtıma izin verilir, bu soruya şu anki geçici çözümümden değinmiştim. Pip3 ile kurulacak ancak pip2 tarafından görülmeyecek bir paket örneği için bkz. [Toga-curses] (https://pypi.python.org/pypi/toga-curses/). – wim