Blog

Python 2.x naar 3.x migreren, hoe doe je dat?

Python 2.x naar 3.x migreren, hoe doe je dat?

Bij het migreren van Python 2.x applicaties naar 3.x komt vaak heel wat kijken. De complexiteit is natuurlijk afhankelijk van meerdere factoren, maar vaak blijkt de omvang van de werkzaamheden een stuk groter zodra je ermee aan de slag gaat.

Voorbereiding

Om inzicht te krijgen in de uitgangspositie, is het goed om de volgende vragen te beantwoorden:

  1. Hoeveel regels code bevat het project?

Het is een heel basale maatstaf, maar het aantal regels code in een project is toch een goede indicator van de complexiteit.

 

  1. Wat is de huidige Python versie compatibiliteit?

Aan de hand van de hoogste Python versie waar de software nu mee werkt is te bepalen wat voor soort veranderingen er nodig zullen zijn in de code.

 

  1. Wat is de gewenste Python versie compatibiliteit?

In eerste instantie zou je kunnen denken dat de nieuwste Python versie de beste keus is, maar er zijn een aantal factoren die de keus kunnen beïnvloeden. Zo kan het systeem waar de applicatie gaat draaien een bepalende factor zijn. Op dit moment is bijvoorbeeld Python 3.9 de meest recente versie, maar bij Ubuntu 20.04 wordt 3.8 geleverd. Daarnaast kan het zo zijn dat de applicatie op een variëteit van systemen moet kunnen werken met verschillende Python versies en misschien zelfs ook nog Python 2.x. Als dat laatste het geval is, is de migratie het lastigst en wordt de druk op het testen extra groot.

 

  1. Wat zijn de dependencies/gebruikte libraries en hun versies?

Naast de code in de applicatie zelf, zijn de gebruikte libraries een grote bepalende factor voor de uit te voeren werkzaamheden. Bij het inventariseren van de gebruikte libraries, kom je per library tot een van de volgende bevindingen:

  • De library is al forward compatibel met de gewenste Python versie, en je hoeft dus niets te doen.
  • Er is een nieuwe versie van de library beschikbaar die compatibel is met de gewenste Python versie. Je kunt dus upgraden naar de nieuwere versie, maar de kans bestaat dat de interface gewijzigd. Dan zul je alle code moeten nalopen die deze library gebruikt en deze aanpassen naar de nieuwe interface.
  • Er is geen nieuwe versie van de library beschikbaar. Dit betekent dat je op zoek moet naar een vervanger die wel Python 3.x compatibel is. Als er geen alternatief is zul je dus zelf een implementatie van de vereiste functionaliteit moeten maken.

 

  1. Welke tests zijn er en wat is de code coverage?

Bij aanpassing van software is het altijd noodzakelijk om te kunnen testen of de nieuwe functionaliteit het doet en of de oude functionaliteit niet defect is geraakt. Aangezien een migratietraject meestal alle componenten van de software raakt, is dit zeer belangrijk.

 

Als je de antwoorden op de bovenstaande vragen hebt, kun je een veel betere inschatting maken van de hoeveelheid werk en kun je een duidelijk stappenplan opstellen.

Uitvoering

Als er goed zicht is op de complexiteit, de eisen, en er een planning is gemaakt, kan aan de uitvoering worden begonnen. Voordat je echter aan de code gaat sleutelen, moet je in ieder geval 2 zaken op orde hebben:

  • De code moet in een versiebeheersysteem, zoals bijvoorbeeld git, zitten. Zo kun je altijd teruggrijpen naar een eerdere versie als er iets misgaat, en je kunt de veranderingen in de loop der tijd terugzien. Dit is enorm waardevol om te begrijpen hoe een defect is ontstaan.
  • Je moet geautomatiseerde tests hebben om snel te kunnen verifiëren dat je veranderingen aan de code geen negatieve impact hebben.

 

Naast de geautomatiseerde tests wil je zoveel mogelijk gebruik maken van andere geautomatiseerde hulpmiddelen. Een van de belangrijkste is het standaard migratiegereedschap ‘2to3’ (https://docs.python.org/3.9/library/2to3.html), geleverd bij Python. Dit gereedschap biedt een set van zogenaamde ‘fixers’ om veel van de code automatisch om te zetten naar geldige Python 3 code. Let op dat deze code dan niet meer terugwaards compatibel is met bijvoorbeeld Python 2.7. Is het voor je applicatie nodig dat deze terugwaardse compatibiliteit er wel is, dan kan ‘six’ (https://pypi.org/project/six/) hulp bieden. Het is vergelijkbaar met ‘2to3’ maar zorgt dat de code compatibel is met zowel Python 2.7 als Python 3.3+.

 

Met al deze hulpmiddelen kan het risico zoveel mogelijk worden ingeperkt en het werk zo snel mogelijk worden uitgevoerd, maar uiteindelijk blijven er eigenlijk altijd code-constructies over die met de hand moeten worden aangepast. Hier komt de expertise op het gebied van zowel Python 2.x als Python 3.x om de hoek kijken.

 

Bij Hendrikx-ITC hebben we ruim 15 jaar ervaring met Python en migraties van Python 2.x naar Python 3.x. Mocht u hulp nodig hebben bij uw migratietraject, dan kunt u altijd onze expertise inschakelen.

Other articles