Python2'den Python3'e kod dönüştürme için, Python ve Django'nun en uygun sürümü hangisidir?


11

Şu anda python2 eski büyük Django projesini python3 sürümüne dönüştürmemiz gereken büyük bir firmada çalışıyorum, bu yüzden ilgili çok sayıda araştırma yaptım, ancak Python ve Django'nun hangi sürüme dönüştürmeye uygun olduğu konusunda mükemmel bir cevap bulamadım.

Şu anda eski sürümümde Python: 2.7.16 & Django: 1.9.13 kullanıyorum.

Herkes bana Python2 ve Python3 dönüşüm yukarıdaki eski sürümü için Python & Django en uygun sürümünü önerebilir.


Python3'ün mevcut sürümü Python 3.8 ve Django'nun en son sürümü Django 3.0'dır. Django'nun web sitesi , 3.8 olan python 3'ün en son sürümünü önermektedir . Hem python hem de django'yu en son sürümlerine hızlandırmak istememenizin özel bir nedeni var mı?
Yeşil Pelerin Adamı

2
Anecdotally, sadece birkaç gün önce, birkaç yıldır sürdürdüğüm Django tabanlı web sitesinin aslında python2.7 kullanarak barındırıldığı sunucuda çalıştığını fark ederken, python3'ü kullanarak yerel olarak çalıştırıyorum. 7. Bulduğum tek fark, f-dizelerini bir yerde ilk kez kullanmaya çalıştığımda ve web sunucusunun sürümünün çökmesi; Aksi takdirde, test etme ve özellik ekleme amacıyla tam olarak beklendiği gibi (tam olarak aynı) yerel ve uzaktan çalışıyor. Benim tamamen anekdot sonucum Django genellikle çoğu şey ile uyumlu olduğu.
Yeşil Pelerin Adamı

1
en son sürüm için, bazı insanların tavsiye etmediğini buldum çünkü en son sürümde yeni güncellemelerle ilgili herhangi bir sorun varsa, bazen çözüm bulmak zor olacak, bu yüzden mevcut projede böyle bir risk yapmak istemiyorum. Test etme aşamasında, projemi en son django ile python 3.7.3 son sürümüne dönüştürmeye başladım ve zaten 30 tür sorun buldum.
Ay

Unutulmamalıdır - bu soru benim için bir inceleme denetiminde ortaya çıktı. "Herhangi bir belge veya başvuru var mı" çok açık konu dışı (site dışı bir kaynak isteme). Ancak, sorunun aşağıdaki kabul edilen cevaba daha iyi cevap verecek şekilde düzenlenebileceğine inanıyorum.
Mayıs

Yanıtlar:


3

Wim'in cevabının savunduğu stratejiye biraz ekleyeceğimi düşündüm - Django'nun uygun versiyonunu hem 2.7 hem de 3.x üzerinde çalıştıralım - ve benim için çalışan bazı taktikleri özetleyin .

Python 2.7, siz 3.x tetiği çekene kadar kaçış bölmenizdir

  • testleriniz her ikisinde de çalışmalıdır
  • f-dizeleri gibi 3.x'e özgü özellikleri kullanmayın
  • önce Python 3.x, daha sonra 2.7'de çalışmayan Django 2.x
  • erken başlayın, fazla analiz etmeyin, ama büyük patlama yaklaşımından kaçının
    • önce dosya dosya.
    • test paketleri içeren yardımcı program kitaplıkları gibi en düşük düzey koduyla başlayın.
    • mümkünse, değişikliklerinizi yavaş yavaş 2.7 üretim dalında birleştirmeye çalışın ve 3.x taşıma kodunuzu ürün değişiklikleriyle güncel tutun.

Django'nun hangi küçük sürümünden başlamalı?

Buradaki kriterlerim, Django göçlerinin oldukça dahil olabileceğidir (ve aslında 2 => 3 işten daha fazla düşünmeyi gerektirir). Bu yüzden en son ve en büyük 1.11'e geçerek 2.7 kullanıcılarınıza bir miktar değer katmış olursunuz. Orada 1.11 önceden 2.x uyumluluk dolgularının iyi bir sayı muhtemelen ve onun 2.x kullanımdan kaldırılması uyarıları almak olacak.

Hangi küçük Python 3.x sürümü ile başlayalım?

Üçüncü taraf kitaplarınızın kullanılabilirliği, CI / devops paketinizden destek ve seçtiğiniz sunucu işletim sistemi görüntülerindeki kullanılabilirlik gibi tüm açıları göz önünde bulundurmak en iyisidir. Örneğin, her zaman 3.8 yükleyebilir ve gereksinimlerinizin bir pip yüklemesini deneyebilirsiniz.

Kaldıraç git (veya kullanmak SCM ne olursa olsun) ve Virtualenv .

  • ayrı requirement.txtdosyalar, ancak ...
  • Eğer bir dosya tabanlı, git repo varsa, her venv işaret edebilir aynı CodeLine bir ile pip install -e <your directory>. Bu, 2 farklı terminalde aynı birim test (ler) e karşı 2.7 ve 3.x çalıştırabileceğiniz anlamına gelir.
  • 2.7 ve 3.x Django sunucularını farklı bağlantı noktalarında yan yana çalıştırabilir ve onlara Firefox ve Chrome diyebilirsiniz.
  • sık sık (en azından taşıma dalında) ve git bisect hakkında bilgi edinin .

2to3 kullanmak

Evet, izin verirseniz 2.7 kodu ve Django kıracak. Yani...

  • önizleme modunda veya tek bir dosyada çalıştırın. neyin kırıldığını görün, aynı zamanda neyin doğru gittiğini de görün.

  • sadece belli dönüşümleri için gaz kelebeği yok 2.7 veya Django bölünürler. print x=> print (x)ve except(Exception) as e2 beyinsizdir.

Kısılmış komutum şöyle görünüyordu:

2to3 $tgt -w -f except -f raise -f next -f funcattrs -f print
  • emin oluncaya kadar dosyayı dosya çalıştırın.

toplu dönüşümler için düzenleyiciniz yerine sed veya awk kullanın .

Avantajı, uygulamalarınızın spesifik özelliklerinden daha fazla haberdar olduğunuzda, 1 dosya veya birçok dosyada çalıştırılabilecek bir değişiklik paketi oluşturabilir ve işin çoğunu 2.7 veya Django'yu bozmadan yapabilirsiniz. Bunu uygun şekilde kısılmış 2to3 geçişinizden sonra uygulayın . Bu sizi editörünüzde kalan temizliklerle ve testlerinizin geçmesini sağlar.

(isteğe bağlı) 2.7 kodda siyah çalışmaya başlar .

bir kod formatlayıcı olan siyah, analizini çalıştırmak için Python 3 AST kullanır. Kodu çalıştırmayı denemez, ancak AST aşamasına ulaşmasını engelleyen sözdizimi hatalarını işaretler. Ama oraya ulaşmak için bazı pip install global magic çalışmanız gerekecek ve siyahın kullanışlılığına satın almalısınız.

Diğer insanlar bunu yaptı - onlardan öğrenin.

Dinleme # 155 Python 3'e geçmek için pratik adımlar size iş hakkında bazı fikirler vermelidir. Bunun için şov bağlantılarına bakın. Ortak bir kod tabanında ve aynı git dalında tetikleyici çekiliş gününe kadar 2.7 kodun 3.x sözdizimine kademeli olarak ayarlanmasını içeren Instagram (?) Hareketini konuşmayı severler.

Ayrıca bkz . Muhafazakar Python 3 Taşıma Kılavuzu

ve Instagram Python 3'e Sorunsuz Hareket Ediyor - Yeni Yığın

Sonuç

Django 1.11 EOL (Nisan 2020) için zamanınız oldukça kısadır, bu nedenle atmak için 2+ dev kaynağınız varsa, aşağıdakileri paralel olarak yapmayı düşünürüm:

  • DEV # 1: 2.7 kullanarak bir Django 1.11 yumruğuna başlayın (teori, Django 1.11'in muhtemelen en iyi Django 2.x'e bir sıçrama noktası olarak konumlandırılmış olması).

  • DEV # 2: Django olmayan yardımcı program kodunuzun Python 3.6 / 3.7'sine başlayın. Kod bu noktada 2,7 uyumlu olduğundan, ilerlerken # 1 ile birleştirin.

Her iki görevin nasıl ilerlediğini görün, Django ile ilgili proje riskinin ne olduğunu ve Python 3 ağrısının neye benzediğini değerlendirin. Zaten Python 2.7 EOL'yi kaçırıyorsunuz, ancak eski bir web çerçevesi muhtemelen en azından birkaç ay boyunca eski Python 2.7'den daha tehlikelidir. Bu yüzden Django 1.9'dan taşınmaya başlamak için çok fazla beklemem ve yaptığınız iş boşa gitmeyecek. İlerlemeyi gördüğünüzde, proje risklerini daha iyi görmeye başlayacaksınız.

İlk 2'ye 3 ilerlemeniz yavaş olacak, ancak takım ve rehberlik hızlı bir şekilde hız alacaksınız, bu yüzden deneyim toplamaya başlamadan önce bunu düşünmeyin. Django tarafı bağlıdır senin ben erken başlamak en iyisi yüzden çerçevesinde kırılma değişikliklere maruz.

PS (tartışmalı / kişisel görüş) Altı veya diğer konserve 2-3 köprü kütüphanelerini fazla kullanmadım.

O var değil o 3. parti kütüphanelerini için parlak - - Ben güvenmiyorum çünkü daha ziyade bir kompleks kalıcı bağımlılık eklemek istemediğini (ve onun doc okumak için tembel oldu). Uzun süredir 3.x uyumlu sözdiziminde 2.7 kod yazıyordum, bu yüzden onları kullanma ihtiyacını gerçekten hissetmedim. Kilometreniz değişebilir ve çok fazla iş gibi görünüyorsa bu yola çıkmayın .

Bunun yerine, çoğu standart kütüphanede kullanımdan kaldırma ve ad değişiklikleri için geçici çözümlerle ilgilenen bu tür içerikle bir py223.py (57 LOC dahil yorumlar) oluşturdum.

try:
    basestring_ = basestring
except (NameError,) as e:
    basestring_ = str

try:
    cmp_ = cmp
except (NameError,) as e:
    # from http://portingguide.readthedocs.io/en/latest/comparisons.html
    def cmp_(x, y):
        """
        Replacement for built-in function cmp that was removed in Python 3
        """
        return (x > y) - (x < y)

Ardından, bu özel endişeleri çözmek için bu py223'ten içe aktarın. Daha sonra I sadece ithalat hendek ve o garip hareket edecek isinstance(x, basestr_)kadar isinstance(x, str)ama yaklaşık endişe az var önceden biliyoruz.


İyi tavsiye. Sadece bir not, Django'nun kendisi zaten sixuyumluluk katmanı için kullanıyor , bu yüzden geçiş sırasında bir Django projesinde kullanmak istiyorsanız, bu "karmaşık bir kalıcı bağımlılık eklemek değil".
wim

@wim. Sana tekrar katılıyorum. altı, ama bakış açısına bağlıdır. Zaten üçüncü taraf kütüphaneleri ile geldi, bu yüzden gereksinimleri ve genel bağımlılıklar açısından "maliyet" olmadığını kaydetti. Ancak ben - belki yanlış - benim kod ortasında büyük bir kara kutu / siğil olarak kabul . tek yaptığınız şey örnek dizesi / unicode / basestring'i test etmekse ve bunu kendiniz nasıl yapacağınızı biliyorsanız, artık ihtiyaç duymadığınızda şimlerinizi nasıl destekleyeceğinizi tam olarak bilirsiniz. Yine de bunu sonuna kadar taşıyacağım.
JL Peyret

O en pip install -e ...(daha düşük bir vaka ile -e), doğru mu?
thebjorn

muhtemelen. düzeltecek
JL Peyret

3

Benim önerim ilk olarak Django==1.11.26hem Python 2 hem de Python 3'ü destekleyen Django'nun en son sürümü olan yükseltmeye geçmektir.

1.10.x ve 1.11.x sürüm notlarını dikkatlice okuyun, kullanım dışı bırakmaları kontrol edin ve 1.9.x kodunuzdan çalışmayı durduran her şeyi düzeltin. Şeyler kırılacak. Django hızlı hareket eder. Büyük bir Django projesi için çok sayıda kod değişikliği gerekebilir ve çok sayıda 3. taraf eklenti veya kitaplık kullanıyorsanız, sürümlerini dengelemek zorunda kalabilirsiniz. 3. taraf bağımlılıklarınızdan bazıları muhtemelen tamamen terk edilmiş olacaktır, bu nedenle değiştirmeleri bulmanız veya özellikleri kaldırmanız gerekir.

Her sürüm yükseltmesine ilişkin sürüm notlarını bulmak için "Django'daki yenilikler" adlı google. İsabetler, tüm itirazları ve değişiklikleri titizlikle belgeleyecek:

Webapp tüm testler geçirerek ile, Django 1.11 üzerinde iyi çalışıyor gibi göründüğünde (eğer bunu doğru bir test kümesine sahip?) Daha sonra aynı Django sürümünü korurken, Python 3 dönüştürme yapabilirsiniz. Django 1.11, Python 3.7'ye kadar destekler, bu nedenle hedeflemek için iyi bir sürüm olacaktır. Baytlar ve metin arasındaki örtülü dönüşümler artık gittiğinden ve birçok Python 2 web uygulaması buna bağlı olduğundan, her yerde unicode bekliyoruz.

Proje Django 1.11 ve Python 3.7'de iyi çalışıyor gibi göründüğünde, Django 3.0'a yükseltmeyi, önceki ile aynı işlemi takip etmeyi düşünebilirsiniz - sürüm notlarını okuma, gerekli değişiklikleri yapma, test paketini çalıştırma ve kontrol etme manuel olarak bir dev sunucusunda webapp.


1
Kesinlikle yol. Test kodunuzu 2.7 ve 3.x sürümlerinde çalıştırın. Aynı git deposuna işaret eden 2 farklı sanal sunucunuz olabilir pip install -E. Birim testleri çalıştıktan sonra, Django-on-3x'in test kullanımını başlatın ve kodu 2 ve 3'te tekrar çalışmaya devam edin. Bazı kodlama ve 2.7 köprülerinizi yakmamaya dikkat ederek - örneğin f dizeleri yok - geçiş çok antiklimaktik. 3.x tamamen kararlı hale geldiğinde, yalnızca 3.x kodunu kullanmaya başlayın. Avantaj, üretim 2.7'nin geçişe kadar her zaman adımda olmasıdır.
JL Peyret

2

İlk önce py3'e geçirdim. Sen bakmak gerekir setup.pykararlı / 1.9.x sürümlerinde (on Django repo https://github.com/django/django/blob/stable/1.9.x/setup.py PY3 anlamaya) desteklenen sürümler 3.4 (ölü) ve 3.5'tir.

Py3.5 ve Django 1.9'a ulaştıktan sonra, bitirmek istediğiniz sürüme ulaşana kadar birer birer yükseltebilirsiniz. Örneğin Django 1.11, py3.5 ve py3.7'yi destekler,

py27/dj19 -> py35/dj19 -> py35/dj1.11 -> py37/dj1.11 ... -> py37/dj2.2

dj2.2 py3.8'i destekleyen ilk sürümdür, ancak normalde muhafazakar bir ortamda çalışıyorsanız muhtemelen py37 / dj2.2'de duracağım.

Başka paketleriniz varsa, her adımda birlikte çalışacak sürüm kombinasyonlarını bulmanız gerekir. Bir plana sahip olmak önemlidir ve her seferinde yalnızca bir bileşenin yükseltilmesi genellikle size zaman kazandırır.

Gelecekteki kütüphane ( https://python-future.org/ ), hem py27 hem de 3.x üzerinde çalıştırmak için koda ihtiyaç duyarken birçok icky durumla ilgili size yardımcı olacaktır. altı da harika. Kendi uyumluluk katmanınızı yuvarlamaktan kaçınırım (neden tekerleği yeniden icat edersiniz?)

Mümkünse, başlamadan önce birim test kapsamınızı% 75-85'e kadar çıkarmaya çalışın ve her yükseltme adımı için hem "hem" ve "ila" sürümleri için otomatik testler ayarlayın. Bir sonraki sürüme geçmeden önce Django'daki tüm uyarıları okuduğunuzdan ve düzelttiğinizden emin olun - Django geriye dönük uyumluluk konusunda çok az önem taşır, bu nedenle normalde yükseltme yolundaki her küçük sürüme vurmanızı öneririm (veya en azından "geriye doğru okuduğunuzdan emin olun" uyumsuzluklar "ve her küçük sürüm için kullanımdan kaldırma listeleri).

İyi şanslar (şu anda py27 / dj1.7'den 300 + Kloc kod tabanını yükseltiyoruz, bu yüzden acınızı hissediyorum ;-)


1
Test kapsamı için +1. Bu, buradaki önemli bir metriktir, hangi yaklaşım olursa olsun, sonuç alınır. Bu gerçekten yaygın kod değişiklikleri denerken yardımcı olur ve ben hiç bir TDD Kırmızı / Yeşil test meraklısı olmayan biri olarak söylüyorum . 2.7 sonuçlarınızı temel almanın bir yolunu bulun ve yükseltme çok daha kolay hale gelir.
JL Peyret

2

Projemle aynı türden bir sorunum var ve Django sürüm 2.2.7 ile python 3.7.5'i denedim.

En son sürüm 3.8 için Python veya Django en son sürüm 3.0 ile gitmemelisiniz, çünkü her türlü hata için en son sürümler için uygun çözümü elde edemeyebilirsiniz.


Bu bir yorum olmalı
Bruno

-2

Mevcut sürümler için çekim yapmaya çalışmalısınız. Python 3.8 ve Django 3.0. Six kütüphanesi bazı kongre değişikliklerinde yardımcı olacaktır. Her iki şekilde de, yeniden düzenleme yapmanız gerekecek, böylece güncel hale getirebilirsiniz.


3
Hiç Django yükseltmesi yaptınız mı? Bu sadece arzulu bir düşünce. 2.7 / 1.9'dan doğrudan Python 3.8 ve Django 3.0'a gitmek neredeyse imkansız olacak. Django 1.9 gibi küçük sürümleri bile 1.10'a yükseltmek bile, birçok kod değişikliğine ihtiyaç duyan zor bir süreç olabilir.
wim

Evet, tam bir refactor yapmak ve başvuruyu güncel hale getirmek için lüks ve zaman onayı aldım. Yine uygulama boyutu, mantık ve zaman kısıtlamaları çoğu çocuklar için büyük bir sorun vardır ama "en iyi çözüm" ya da "hüsnükuruntu" Bence tavsiye yüzden, uygulama boyutu veya zaman sınırlaması söz etmemişti;)
Dave

Ek olarak Ansible ve LTS Ubuntu üzerinde çalışan şeyler hakkında endişelenmeniz gerekiyorsa, Ubuntu 18.04'te 3.7 desteğinin bile olmadığını göreceksiniz. Dinlediğim güvenlik podcast'leri 3,8 puan bırakana kadar gereksiz yere riske atmak için 2,1'e izin veriyor.
JL Peyret

İyi bir güvenlik podcast önerisi var mı?
Dave

Python sn için, listennotes.com/podcasts/talk-python-to-me/… Ama bir süre için 3.8-in dikkat daha yakın olduğunu düşünüyorum. Risky Business , uluslararası ilişkileri takip ederseniz, iyi ve eğlenceli bir güvenlik podcastidir. Downvote için özür dilerim, ama evet, davanızda işe yarayan şey başka birini farklı bir bağlamda tarpit edebilir. 2-3 dönüşüm için bkz. Listennotes.com/podcasts/talk-python-to-me/…
JL Peyret
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.