Saat ini saya sedang bekerja di perusahaan besar di mana kita perlu mengkonversi proyek Django besar python2 tua ke versi python3 jadi saya telah melakukan banyak penelitian terkait tetapi masih belum dapat menemukan jawaban yang sempurna terkait dengan versi Python dan Django yang paling cocok untuk konversi.
Saat ini saya menggunakan Python: 2.7.16 & Django: 1.9.13 dalam versi lama saya.
Siapa pun dapat menyarankan saya versi Python & Django yang paling cocok untuk versi lama di atas untuk konversi python2 ke python3.
python
django
python-3.x
python-2to3
Bulan
sumber
sumber
Jawaban:
Saya pikir saya akan menambahkan sedikit pada strategi yang dianjurkan oleh jawaban Wim - dapatkan versi Django yang tepat bekerja pada 2.7 dan 3.x pertama - dan uraikan beberapa taktik yang bekerja untuk saya.
Python 2.7 adalah pod pelarian Anda, hingga Anda menarik pelatuk pada 3.x
Django versi minor mana yang memulai?
Kriteria saya di sini adalah bahwa migrasi Django dapat dilibatkan secara adil (dan sebenarnya membutuhkan lebih banyak pemikiran daripada 2 => 3 pekerjaan). Jadi saya akan pindah ke 1,11 terbaru dan terhebat dengan cara itu Anda sudah memberikan nilai kepada pengguna 2,7 Anda. Mungkin ada sejumlah shims kompatibilitas pra-2.x yang baik pada 1.11 dan Anda akan mendapatkan peringatan penghentian 2.x.
Versi minor apa dari Python 3.x untuk memulai?
Yang terbaik untuk mempertimbangkan semua sudut, seperti ketersediaan lib pihak ke-3 Anda, dukungan dari suite CI / devops Anda dan ketersediaan pada gambar OS server yang Anda pilih. Anda selalu dapat menginstal 3.8 dan mencoba menginstal pip dari requirement.txt Anda sendiri, misalnya.
Leverage git (atau apa pun SCM yang Anda gunakan) dan virtualenv .
requirement.txt
file, tetapi ...pip install -e <your directory>
. itu berarti bahwa, di 2 terminal yang berbeda Anda dapat menjalankan 2.7 dan 3.x terhadap unittest yang sama.memanfaatkan 2to3
Ya, itu akan merusak 2,7 kode dan Django jika Anda membiarkannya. Begitu...
jalankan dalam mode pratinjau atau terhadap satu file. melihat apa yang rusak tetapi juga melihat apa yang dilakukannya dengan benar.
throttle ke hanya konversi tertentu yang tidak melanggar 2.7 atau Django.
print x
=>print (x)
danexcept(Exception) as e
2 tidak punya otak.Ini adalah apa yang tampak seperti perintah tercekik saya:
gunakan sed atau awk daripada editor Anda untuk konversi massal.
Keuntungannya adalah, ketika Anda menjadi lebih sadar akan masalah spesifik aplikasi Anda, Anda dapat membuat serangkaian perubahan yang dapat dijalankan pada 1 file atau banyak file dan melakukan sebagian besar pekerjaan tanpa melanggar 2,7 atau Django. Terapkan ini setelah pas 2to3 Anda yang dipercantik . Itu membuat Anda dengan pembersihan sisa di editor Anda dan mendapatkan tes Anda untuk lulus.
(opsional) mulai hitam pada kode 2.7.
hitam yang merupakan pemformat kode, menggunakan Python 3 AST untuk menjalankan analisisnya. Itu tidak mencoba menjalankan kode, tetapi itu akan menandai kesalahan sintaksis yang mencegahnya mencapai tahap AST. Anda harus bekerja beberapa pip menginstal sihir global untuk sampai ke sana dan Anda harus membeli kegunaan hitam.
Orang lain telah melakukannya - belajarlah dari mereka.
Mendengarkan # 155 Langkah-langkah praktis untuk pindah ke Python 3 harus memberi Anda beberapa ide pekerjaan. Lihatlah tautan pertunjukan untuk itu. Mereka suka membicarakan langkah Instagram (?) Yang melibatkan penyesuaian bertahap menjalankan 2,7 kode ke sintaks 3.x pada basis kode umum, dan pada cabang git yang sama, sampai hari penarik-pemicu.
Lihat juga Panduan Porting Conservative Python 3
dan Instagram Melakukan Gerakan Lancar ke Python 3 - Stack Baru
Kesimpulan
Waktu Anda untuk Django 1.11 EOL (April 2020) agak singkat, jadi jika Anda memiliki 2+ sumber daya dev untuk dilemparkan padanya, saya akan mempertimbangkan melakukan hal berikut secara paralel:
DEV # 1: mulai dengan Django 1.11 bump (teorinya adalah bahwa Django 1.11 mungkin paling baik diposisikan sebagai titik tolak ke Django 2.x), menggunakan 2.7.
DEV # 2: memulai Python 3.6 / 3.7 dari kode utilitas non-Django Anda. Karena kode 2.7 kompatibel pada titik ini, gabungkan menjadi # 1 saat Anda menggunakannya.
Lihat bagaimana kedua tugas berjalan, menilai apa risiko proyek terkait Django dan seperti apa rasa sakit Python 3. Anda sudah kehilangan Python 2.7 EOL, tetapi kerangka kerja web yang usang mungkin lebih berbahaya daripada warisan Python 2.7, setidaknya selama beberapa bulan. Jadi saya tidak akan menunggu terlalu lama untuk mulai bermigrasi dari Django 1.9 dan pekerjaan Anda melakukannya tidak akan sia-sia. Ketika Anda melihat kemajuannya, Anda akan mulai melihat risiko proyek dengan lebih baik.
Kemajuan 2to3 awal Anda akan lambat, tetapi alat dan bimbingannya cukup bagus sehingga Anda akan dengan cepat menambah kecepatan jadi jangan terlalu memikirkannya sebelum mulai mengumpulkan pengalaman. Sisi Django tergantung pada paparan Anda untuk memecahkan perubahan dalam kerangka kerja itu sebabnya saya pikir yang terbaik untuk memulai lebih awal.
PS (pendapat kontroversial / pribadi) Saya tidak menggunakan enam atau banyak perpustakaan jembatan 2-ke-3 kaleng lainnya.
Itu bukan karena saya tidak percaya - itu brilian untuk lib pihak ke-3 - tetapi saya tidak ingin menambahkan ketergantungan permanen yang kompleks (dan saya terlalu malas untuk membaca dokumennya). Saya telah menulis kode 2,7 dalam sintaks yang kompatibel dengan 3.x untuk waktu yang lama jadi saya tidak benar-benar merasa perlu untuk menggunakannya. Jarak tempuh Anda mungkin bervariasi dan tidak memulai jalur ini jika sepertinya banyak pekerjaan .
Sebagai gantinya, saya membuat py223.py (57 LOC termasuk komentar) dengan jenis konten ini, yang sebagian besar berkaitan dengan solusi untuk penghentian dan perubahan nama di perpustakaan standar.
Kemudian impor dari py223 itu untuk mengatasi masalah khusus tersebut. Kemudian saya hanya akan parit impor dan memindahkan aneh
isinstance(x, basestr_)
untukisinstance(x, str)
tapi saya tahu sebelumnya ada sedikit untuk khawatir tentang.sumber
six
untuk lapisan kompatibilitas, jadi jika Anda ingin menggunakannya dalam proyek Django selama transisi, maka ini bukan "menambahkan ketergantungan permanen yang kompleks".pip install -e ...
(dengan huruf kecil-e
), kan?Saran saya adalah upgrade dulu ke
Django==1.11.26
, yang merupakan versi terbaru dari Django yang mendukung Python 2 dan Python 3. Tetap di versi Python 2.7 Anda saat ini untuk saat ini.Baca dengan cermat catatan rilis untuk 1.10.x dan 1.11.x, memeriksa penghentian dan memperbaiki apa pun yang berhenti berfungsi dari kode 1.9.x Anda. Hal-hal AKAN hancur. Django bergerak cepat. Untuk proyek Django besar, mungkin ada banyak perubahan kode yang diperlukan, dan jika Anda menggunakan banyak plugin atau pustaka pihak ketiga, Anda mungkin harus menyulap versinya. Beberapa dependensi pihak ketiga Anda mungkin telah ditinggalkan seluruhnya, jadi Anda harus mencari penggantian atau menghapus fitur-fiturnya.
Untuk menemukan catatan rilis untuk setiap peningkatan versi, cukup google "Apa yang baru di Django". Hit akan dengan cermat mendokumentasikan semua penghinaan dan perubahan:
Setelah webapp tampaknya berfungsi dengan baik pada Django 1.11, dengan semua tes berlalu (Anda lakukan memiliki suite tes, kan?) Maka Anda dapat melakukan Python 3 konversi, sementara menjaga versi Django yang sama. Django 1.11 mendukung hingga Python 3.7, sehingga itu akan menjadi versi yang bagus untuk ditargetkan. Harapkan unicode di semua tempat, karena konversi implisit antara byte dan teks telah hilang sekarang dan banyak webapp Python 2 mengandalkan itu.
Setelah proyek tampaknya berfungsi dengan baik pada Django 1.11 dan Python 3.7, maka Anda dapat berpikir untuk memutakhirkan ke Django 3.0, mengikuti proses yang sama seperti sebelumnya - membaca catatan rilis, membuat perubahan yang diperlukan, menjalankan test suite, dan memeriksa webapp di server dev secara manual.
sumber
pip install -E
. Setelah unit test berjalan, mulailah uji coba penggunaan Django-on-3x dan teruskan kode berfungsi dalam 2 dan 3. Dengan beberapa pengkodean yang cermat dan berhati-hati untuk tidak membakar 2,7 jembatan Anda - misalnya tanpa string misalnya - peralihan akan menjadi sangat antiklimaks. Setelah 3.x sepenuhnya stabil, mulailah menggunakan kode 3.x saja. Keuntungannya adalah bahwa produksi 2.7 selalu dalam langkah sampai beralih.Saya akan memutakhirkan ke py3 pertama. Anda harus melihatnya di
setup.py
repo Django di cabang stable / 1.9.x ( https://github.com/django/django/blob/stable/1.9.x/setup.py ) untuk mengetahui bahwa py3 versi yang didukung adalah 3.4 (mati) dan 3.5.Setelah Anda menggunakan py3.5 dan Django 1.9, Anda dapat memutakhirkan satu per satu hingga Anda mendapatkan versi yang ingin Anda akhiri. Misalnya Django 1.11 mendukung py3.5 dan py3.7, jadi
dj2.2 adalah versi pertama yang mendukung py3.8, tapi saya mungkin akan berhenti di py37 / dj2.2 jika Anda bekerja di lingkungan yang biasanya konservatif.
Jika Anda memiliki paket lain, Anda harus menemukan kombinasi versi yang akan bekerja bersama pada setiap langkah. Memiliki rencana adalah kuncinya, dan memutakhirkan hanya satu komponen pada satu waktu biasanya akan menghemat waktu Anda.
Pustaka yang akan datang ( https://python-future.org/ ) akan membantu Anda dengan banyak situasi menjengkelkan saat Anda membutuhkan kode untuk dijalankan di py27 dan 3.x. Enam juga bagus. Saya akan menghindari menggulung lapisan kompatibilitas Anda sendiri (mengapa menciptakan kembali kemudi?)
Jika memungkinkan, cobalah untuk mendapatkan cakupan pengujian unit Anda hingga 75-85% sebelum memulai, dan tentukan mengatur pengujian otomatis pada versi "dari" dan "ke" untuk setiap langkah peningkatan. Pastikan Anda membaca dan memperbaiki semua peringatan dari Django sebelum memutakhirkan ke versi berikutnya - Django sangat peduli tentang kompatibilitas ke belakang, jadi saya biasanya menyarankan untuk memukul setiap versi minor di jalur peningkatan (atau setidaknya pastikan Anda membaca "mundur" ketidakcocokan "dan daftar penghentian untuk setiap versi minor).
Selamat mencoba (kami meningkatkan 300 + basis kode Kloc dari py27 / dj1.7 sekarang, jadi saya merasakan sakit Anda ;-)
sumber
Saya memiliki masalah yang sama dengan proyek saya dan saya telah mencoba python 3.7.5 dengan Django versi 2.2.7.
Anda seharusnya tidak menggunakan python versi terbaru 3.8 atau Django latest versi 3.0 karena Anda mungkin ada kemungkinan bahwa untuk semua jenis bug Anda mungkin tidak bisa mendapatkan solusi yang tepat untuk versi terbaru.
sumber
Anda harus mencoba memotret untuk versi saat ini. Python 3.8 dan Django 3.0. Enam perpustakaan akan membantu dengan beberapa perubahan konvensi. Apa pun cara Anda harus melakukan beberapa refactoring sehingga Anda mungkin membuatnya saat ini.
sumber