{"id":7614,"date":"2025-11-28T19:03:42","date_gmt":"2025-11-28T18:03:42","guid":{"rendered":"https:\/\/web-dev-weissblau.de\/microconsult\/?p=7614"},"modified":"2026-02-13T19:46:58","modified_gmt":"2026-02-13T18:46:58","slug":"migration-to-python-3","status":"publish","type":"post","link":"https:\/\/www.microconsult.de\/en\/migration-auf-python-3\/","title":{"rendered":"Migration to Python 3"},"content":{"rendered":"<h2>Warum die Uhr immer lauter tickt<\/h2>\n<p>Autor: Rainer Grimm, Modernes<\/p>\n<h3>Beitrag &#8211; Embedded Software Engineering Kongress 2018<\/h3>\n<p><strong>Python 3 wurde im Jahr 2008 ver\u00f6ffentlicht. Da Python 3 nicht abw\u00e4rtskompatibel zu Python 2 ist, wurde in der Regel der bestehende Code in Python 2 weiterentwickelt und der neue Code direkt in Python 3 geschrieben. Die Existenz zweier Parallelwelten nimmt am 1.1.2020 ein abruptes Ende. Mit dem 1.1.2020 wird der Unterst\u00fctzung von Python 2 eingestellt. Die Migration der Codebasis von Python 2 nach Python 3 ist daher unvermeidlich.<\/strong><\/p>\n<h2>Neue Features in Python 3<\/h2>\n<h3>print ist eine Funktion<\/h3>\n<p>Die neue Syntax von Print ist allgemein print(*args, sep = &#8220; &#8222;, end = &#8220; &#8222;, file = sys.stdout, flush = True), wobei args die Argumente, sep den Separator zwischen den Argumenten, end das Zeilenendzeichen, file das Ausgabemedium und flush den Puffer bezeichnet. Die folgende Tabelle stellt die syntaktischen Ver\u00e4nderungen der print-Funktion inklusive ihrer Defaultwerte gegen\u00fcber.<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"141\"><strong>Beispiele<\/strong><\/td>\n<td valign=\"top\" width=\"198\"><strong>Python 2.*<\/strong><\/td>\n<td valign=\"top\" width=\"208\"><strong>Python 3.*<\/strong><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"141\">Allgemeine Form<\/td>\n<td valign=\"top\" width=\"198\">print &#8222;x= &#8222;,5<\/td>\n<td valign=\"top\" width=\"208\">print(&#8222;x= &#8222;,5)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"141\">Zeilenumbruch<\/td>\n<td valign=\"top\" width=\"198\">print<\/td>\n<td valign=\"top\" width=\"208\">print()<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"141\">Unterdr\u00fccken des Zeilenumbruchs<\/td>\n<td valign=\"top\" width=\"198\">print x,<\/td>\n<td valign=\"top\" width=\"208\">print(x, end = &#8222;&#8220;)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"141\">Unterdr\u00fccken des Zeilenumbruchs ohne Leerzeichen<\/td>\n<td valign=\"top\" width=\"198\"><\/td>\n<td valign=\"top\" width=\"208\">print(1, 2, 3, 4, 5, \u00a0sep = &#8222;&#8220;)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"141\">Umleitung der Ausgabe<\/td>\n<td valign=\"top\" width=\"198\">print &gt;&gt; sys.stderr, &#8222;error&#8220;<\/td>\n<td valign=\"top\" width=\"208\">print(&#8222;error&#8220;, file = sys.stderr)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Der Vorteil der neuen Version offenbart sich aber erst auf den zweiten Blick, denn die print-Funktion l\u00e4sst sich jetzt \u00fcberladen: Das Listing zeigt eine print-Funktion, die sowohl in die Standardausgabe als auch in eine Logdatei schreibt. Dazu instrumentalisiert sie die Built-in-Funktion __builtins__.print. (siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>)<\/p>\n<h3>Lazy Evaluation<\/h3>\n<p>Nur das N\u00f6tigste tun, das ist bei Programmiersprachen durchaus eine Tugend. In Python 3 erh\u00e4lt Lazy Evaluation deutlich mehr Gewicht. Listen, Dictionaries oder die funktionalen Bausteine von Python erzeugen jetzt nicht mehr die gesamte Liste, sondern eben nur noch so viel, wie f\u00fcr die Auswertung des Ausdrucks notwendig ist. Diese Bedarfsauswertung spart kostbaren Speicherplatz und Zeit. Das erreicht der Python-Interpreter dadurch, dass er nur noch einen Generator zur\u00fcckgibt, der auf Anfrage die Werte erzeugt. Dies war schon in Python 2 der feine Unterschied zwischen den Funktionen range() und xrange(). Mit Python 3 verh\u00e4lt sich nun range()wie xrange(), weshalb die zweite Funktion \u00fcberfl\u00fcssig wird.<\/p>\n<p>Entsprechend liegt der Fall bei den funktionalen Bausteinen map(), filter() und zip(). Diese Funktionen wurden durch ihre \u00c4quivalente aus der Bibliothek itertools ersetzt. Bei Dictionaries hei\u00dfen die resultierenden Generatoren Views. Ben\u00f6tigt der Programmierer hingegen die voll expandierte Liste, hilft ein einfaches Kapseln des Generators in einem list()-Konstruktor, wie das folgende Beispiel zeigt: list(range(11)) ergibt [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].<\/p>\n<h3>True Division<\/h3>\n<p>Gerade Python-Einsteiger sind h\u00e4ufig erstaunt, dass 1\/2 == 0 ergibt. Python 3 beseitigt diesen Zustand und unterscheidet zwischen True Division und Floor Division. W\u00e4hrend f\u00fcr die True Division 1\/2 == 0.5\u00a0 ergibt, verh\u00e4lt sich die Floor Division wie die Division in Python 2. Ihre Notation verwendet zwei Schr\u00e4gstriche: 1\/\/2 == 0.<\/p>\n<h3>Unicode-Strings und Byte-Strings<\/h3>\n<p>Musste der Programmierer in Python 2 Strings noch explizit als Unicode-Strings deklarieren, so sind diese Zeichenketten jetzt implizit Unicode-Strings. Python 3 kennt nur noch Text und Daten. Text (str [1]) sind Strings und entsprechen dem Unicode-String aus Python 2. Daten (bytes [2]) sind 8-Bit-Strings und entsprechen den Python-2-Strings. Daten muss der Python-3-Entwickler deklarieren: b&#8220;8-Bit-String&#8220;. Die Tabelle zeigt dies in der \u00dcbersicht.<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"148\"><strong>Typ<\/strong><\/td>\n<td valign=\"top\" width=\"108\"><strong>Python 2.*<\/strong><\/td>\n<td valign=\"top\" width=\"122\"><strong>Python 3.*<\/strong><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"148\">8-Bit-String<\/td>\n<td valign=\"top\" width=\"108\">&#8222;string&#8220;<\/td>\n<td valign=\"top\" width=\"122\">b&#8220;string&#8220;<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"148\">Unicode-String<\/td>\n<td valign=\"top\" width=\"108\">u&#8220;string&#8220;<\/td>\n<td valign=\"top\" width=\"122\">&#8222;string&#8220;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Um zwischen den Datentypen zu konvertieren, gibt es die Funktionen str.encode() und bytes.decode(). Diese Konvertierung ben\u00f6tigt der Entwickler in Python 3, wenn er beide Datentypen verwendet, denn es findet keine implizite Typkonvertierung mehr statt. (siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>)<\/p>\n<h3 align=\"left\">Function Annotations<\/h3>\n<p>Mit Function Annotations bietet Python 3 die M\u00f6glichkeit, Metadaten an eine Funktion zu binden. Die Funktion l\u00e4sst sich im zweiten Schritt auch mit Dekoratoren [3] versehen, die automatisch aus den Metadaten eine Dokumentation erzeugen oder die Typen zur Laufzeit pr\u00fcfen. Die \u00e4quivalenten Funktionen sumOrig() und sumMeta() zeigen die Funktionsdeklaration mit und ohne Metadaten. Die zweite Funktion ist um Metadaten zur Signatur und zum R\u00fcckgabewert der Funktion erweitert. Die Metadaten lassen sich mit dem Funktionsattribut __annotations__ referenzieren. (siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>)<\/p>\n<h2>Aufr\u00e4umarbeiten in Python 3<\/h2>\n<p>Wo es Ver\u00e4nderungen gibt, wollen auch Altlasten bereinigt und entsorgt sein. Dies betrifft Bibliotheken, die entfernt wurden, die nun gem\u00e4\u00df dem Python Style Guide [4] klein geschrieben werden, die neu in Pakete verpackt wurden oder in einer C- und einer Python-Implementierung koexistieren.<\/p>\n<h3>Import Idiom<\/h3>\n<p>Das bekannte Python-Idiom, erst die schnelle C-Implementierung eines Moduls zu importieren und im Fehlerfall auf die Python-Implementierung zur\u00fcckzugreifen, ist nicht mehr notwendig. Python erledigt dies automatisch. (siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>)<\/p>\n<p>Genaueres zu den \u00c4nderungen der Standardbibliothek ist unter [5] zu finden.<\/p>\n<h3>Kooperative super-Aufrufe und Old-Style Klassen<\/h3>\n<p>Es gibt weitere Punkte, die das Leben des Python-Programmierers erleichtern. So muss er bei kooperativen super-Aufrufen nicht mehr die Instanz der Klasse und den Klassennamen nennen. Die Old-Style-Klassen, existieren mit Python 3 nicht mehr, sodass das l\u00e4stige Ableiten von object nicht mehr notwendig ist, um die neueren Features von Python anzusprechen.<\/p>\n<h3>input entfernt<\/h3>\n<p>Das unmittelbare Evaluieren der Eingabe mit Hilfe des Kommandos input() ist nicht mehr m\u00f6glich, da die Eingabe als Eingabestring zur Verf\u00fcgung steht. Damit hat sich ein extremes Sicherheitsloch geschlossen. (siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>)<\/p>\n<p>Konsequenterweise wurde die Funktion raw_input() in input() umbenannt, sowie raw_input() entfernt.<\/p>\n<h3>R\u00fcckportierung von Python Features<\/h3>\n<p>Sinn und Zweck von Python 2.7 ist es, den Umstieg auf die Version 3 so einfach wie m\u00f6glich zu vollziehen. Aus diesem Grund hat das Projekt viele Features von Python 3.0 auf Python 2.7 r\u00fcckportiert.<\/p>\n<h3>Kontext-Manager<\/h3>\n<p>Der Kontext-Manager mit with ist ein wichtiges neues Feature, das mit Python 2.6 zur Verf\u00fcgung steht. Eine Ressource (Datei, Socket, Mutex etc.) bindet Python automatisch beim Eintritt in den with-Block und gibt sie beim Austritt wieder frei. C++-Programmierern wird dieses Idiom an &#8222;Resource Acquisition Is Initialization&#8220; (RAII) erinnern [6].<\/p>\n<p>Das with-Statement verh\u00e4lt sich aus Anwendersicht wie ein try \u2026 finally, da sowohl der try-Block als auch der finally-Block immer ausgef\u00fchrt werden. Dies alles geschieht aber ohne explizite Ausnahmebehandlung.<\/p>\n<p>Wie funktioniert nun das Ganze? In einem with-Block l\u00e4sst sich jedes Objekt verwenden, das das Kontext-Management-Protokoll anbietet, das also die internen Methoden __enter()__ und __exit()__ besitzt. Beim Eintritt in den with-Block ruft Python die __enter()__ und beim Austritt die __exit()__ Methode automatisch auf. Das Datei-Objekt bringt die entsprechenden Methoden von Haus aus mit. (siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\">PDF<\/a>)<\/p>\n<p>Ressourcen-Management ist aber auch schnell selbst durch die Methoden __enter()__ und __exit()__ implementiert. Wem dies noch zu viel Arbeit ist, der kann den Dekorator contextmanager aus der Bibliothek contextlib [6] verwenden, um vom Kontext-Management zu profitieren. Weitere Anwendungsf\u00e4lle sind im Python Enhancement Proposal (PEP) 0343 [8] zu finden.<\/p>\n<h3>Abstrakte Basisklassen<\/h3>\n<p>Die wohl gr\u00f6\u00dfte syntaktische Erweiterung vollzieht sich in Python 2.6 mit der Einf\u00fchrung von abstrakten Basisklassen. Ob ein Objekt sich in einem Kontext verwenden l\u00e4sst, hing bisher von den Merkmalen des Objekts ab und nicht von dessen formaler Schnittstellenspezifikation.<\/p>\n<p>Dieses Idiom wird Duck-Typing genannt, frei nach dem Gedicht von James Whitcomb Riley: &#8222;When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.&#8220;<\/p>\n<p>Sobald eine Klasse eine abstrakte Methode besitzt, wird sie zur abstrakten Basisklasse und l\u00e4sst sich nicht instanziieren. Von ihr abgeleitete Klassen k\u00f6nnen nur erzeugt werden, wenn sie diese abstrakten Methoden implementieren. Abstrakte Basisklassen in Python verhalten sich \u00e4hnlich wie abstrakte Basisklassen in C++, insbesondere d\u00fcrfen abstrakte Methoden eine Implementierung enthalten.<\/p>\n<p>Neben den abstrakten Methoden kennt Python auch abstrakte Properties. Die Python-Version 3 verwendet abstrakte Basisklassen in den Modulen numbers [9] und collections [10].<\/p>\n<p>Die entscheidende Frage steht noch aus: Wie wird eine Klasse zur abstrakten Klasse? Die Klasse ben\u00f6tigt die Metaklasse ABCMeta. Daraufhin lassen sich die entsprechenden Methoden als @abstractmethod oder Properties als @abstactproperty mit Hilfe des entsprechenden Dekorators deklarieren. Die Verwendung von abstrakten Basisklassen bedeutet dar\u00fcber hinaus, dass in die dynamisch typisierende Sprache statische Typisierung Einzug h\u00e4lt.<\/p>\n<p>Das Beispiel kann die Klasse Cygnus nicht instanziieren, da es die abstrakte Methode quack() nicht implementiert.<br \/>\n(siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>)<\/p>\n<h3>Mehrere Prozessoren<\/h3>\n<p>Pythons Antwort auf Multiprozessor-Architekturen ist die neue Bibliothek multiprocessing [11]. Dieses Modul imitiert das bekannte Python-Modul threading, nur erzeugt es statt eines Thread einen Prozess, und dies auch noch plattformunabh\u00e4ngig. Das Multiprocessing-Modul war notwendig, da in CPython, der Standardimplementierung von Python, nur ein Thread im Interpreter laufen kann. Geschuldet ist dieses Verhalten dem so genannten Global Interpreter Lock, kurz GIL [12].<\/p>\n<h2>Migration auf Python 3<\/h2>\n<p>Zum Portieren von Python-2-Code nach Python 3 zeichnet sich ein klar definierter Pfad ab, wobei der Entwickler nach jedem Schritt den Code testen und Probleme beseitigen muss. (siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\">PDF<\/a>)<\/p>\n<p>Die vier Codezeilen sollen als Beispiel f\u00fcr die Migration von Python 2 nach 3 dienen. Alle vier Zeilen des Beispiels verwenden funktionale Komponenten von Python, da sich bei diesen built-in-Funktionen einige Ver\u00e4nderungen vollzogen haben. (siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>)<\/p>\n<p>Die erste Funktion berechnet die Summe der drei Zahlen 2, 3 und 4, indem sie diese Argumente auf die Lambda-Funktion anwendet. Das built-in reduce() reduziert sukzessive die Liste aller Zahlen von 1 bis einschlie\u00dflich der 10, indem sie das Ergebnis der letzten Multiplikation mit der n\u00e4chsten Zahl aus der Sequenz multipliziert. Die letzten zwei Funktionen filtern aus dem String alle W\u00f6rter heraus, die mit einem Gro\u00dfbuchstaben beginnen. Der Code funktioniert bereits unter Python 2.6, sodass nur noch die Schritte 3 und 4 f\u00fcr die Portierung zu vollziehen sind.<\/p>\n<p>Ein Aufruf des Python-2.7-Interpreters mit der Option -3 zeigt die Inkompatibilit\u00e4ten zur Version 3: Sowohl die Funktion apply() als auch die Funktion reduce() sind in Python 3 keine built-ins mehr.\u00a0(siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\">PDF<\/a>)<\/p>\n<p>Der Code ist schnell repariert und die Deprecation-Warnungen unterbleiben. (siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>)<\/p>\n<p>Das Script 2to3.py erweist sich bei der Korrektur des Python-2-Code als sehr hilfreich, denn er erzeugt im letzten Schritt automatisch Code f\u00fcr Python 3. Dazu bietet das Tool mehrere Optionen an. (siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>)<\/p>\n<p>Der direkte Weg besteht darin, die Ursprungsdatei zu \u00fcberschreiben: python &lt;path to 2to3.py&gt; port.py -w. Das Ergebnis ist der nach Python 3 portierte Quelltext. Interessanterweise hat der Codegenerator den filter()-Ausdruck durch eine \u00e4quivalente List-Comprehension ersetzt. (siehe Abb. im\u00a0<a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>)<\/p>\n<h3 align=\"left\">Python 2 und Python 3 unterst\u00fctzen<\/h3>\n<p align=\"left\">Soll der Python-Code so umgeschrieben werden, so dass er sowohl durch Python 2 als auch durch Python 3 unterst\u00fctzt wird, dann helfen die Scripte\u00a0 futurize [13] und modernize [14]. Das Script modernize ist bei der Modifikation des Python Codes konservativer als das Script futurize. Wie im vorherigen Abschnitt gibt es zwei Voraussetzung f\u00fcr die Modifikation des Python-Codes: Eine Testabdeckung zu besitzen und den Python-Code bereits Python 2.7 migriert zu haben.<\/p>\n<p align=\"left\">Welche syntaktischen Unterschiede Python 2 und Python 3 im Detail mitbringen und wie sich Python-Code schreiben l\u00e4sst, der sowohl von Python 2 als auch von Python 3 unterst\u00fctzt wird, das beschreibt der Spickzettel &#8222;Cheat Sheet: Writing Python 2-3 compatible code&#8220; [15] im Detail.<\/p>\n<h2 align=\"left\">Weiterf\u00fchrende Information<\/h2>\n<p align=\"left\">[1]: Datentyp str: https:\/\/docs.python.org\/3\/library\/functions.html#str<\/p>\n<p align=\"left\">[2]: Datentyp bytes: https:\/\/docs.python.org\/3\/library\/functions.html#bytes<\/p>\n<p align=\"left\">[3]: Rainer Grimm, &#8222;Dekoratoren in Python&#8220;: Linux-Magazin 06\/09, S. 96<\/p>\n<p align=\"left\">[4]: PEP 8 \u2013 Style Guide for Python Code: https:\/\/www.python.org\/dev\/peps\/pep-0008\/<\/p>\n<p align=\"left\">[5]: What\u2019s New in Python 3: https:\/\/docs.python.org\/3\/whatsnew\/3.0.html#library-changes<\/p>\n<p align=\"left\">[6]: RAII: https:\/\/de.wikipedia.org\/wiki\/Ressourcenbelegung_ist_Initialisierung<\/p>\n<p align=\"left\">[7]: Bibliothek contextlib:\u00a0<a title=\"Bibliothek contextlib\" href=\"https:\/\/docs.python.org\/3.0\/library\/contextlib.html#module-contextlib\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.python.org\/3\/library\/contextlib.html#module-contextlib<\/a><\/p>\n<p align=\"left\">[8]: PEP 0343: https:\/\/www.python.org\/dev\/peps\/pep-0343<\/p>\n<p align=\"left\">[9]: Bibliothek numbers:\u00a0<a title=\"Bibliothek numbers\" href=\"https:\/\/docs.python.org\/3.0\/library\/numbers.html#module-numbers\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.python.org\/3\/library\/numbers.html#module-numbers<\/a><\/p>\n<p align=\"left\">[10]: Bibliothek collections:\u00a0<a title=\"Bibliothek collections\" href=\"https:\/\/docs.python.org\/3.0\/library\/collections.html#module-collection\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.python.org\/3\/library\/collections.html#module-collection<\/a><\/p>\n<p align=\"left\">[11]: Bibliothek multiprocessing:\u00a0<a title=\"Bibliothek multiprocessing\" href=\"https:\/\/docs.python.org\/3\/library\/multiprocessing.html#module-multiprocessing\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.python.org\/3\/library\/multiprocessing.html#module-multiprocessing<\/a><\/p>\n<p align=\"left\">[12]: Der Global Interpreter Lock (GIL):\u00a0<a title=\"Global Interpreter Lock \" href=\"https:\/\/docs.python.org\/c-api\/init.html#thread-state-and-the-global-interpreter-lock\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.python.org\/c-api\/init.html#thread-state-and-the-global-interpreter-lock<\/a><\/p>\n<p align=\"left\">[13]: Futurize: https:\/\/python-future.org\/automatic_conversion.html<\/p>\n<p align=\"left\">[14]: Modernize: https:\/\/python-modernize.readthedocs.io\/en\/latest<\/p>\n<p align=\"left\">[15]: Cheat Sheet: Writing Python 2-3 compatible code: https:\/\/python-future.org\/compatible_idioms.html<\/p>\n<h2>Autor<\/h2>\n<p>Rainer Grimm ist seit vielen Jahren als Softwarearchitekt, Team- und Schulungsleiter t\u00e4tig. In seiner Freizeit schreibt er gerne Artikel zu den Programmiersprachen C++, Python und Haskell, spricht aber auch gerne auf Fachkonferenzen. Auf seinem Blog Modernes C++ (Heise Developer) besch\u00e4ftigt er sich intensiv mit seiner Leidenschaft C++. Seit 2016 steht er auf selbstst\u00e4ndigen Beinen. Insbesondere das Vermitteln von Wissen zu modernem C++ ist ihm eine Herzensangelegenheit. Seine B\u00fccher &#8222;C++11 f\u00fcr Programmierer&#8220;, &#8222;C++&#8220; und &#8222;C++-Standardbibliothek&#8220; f\u00fcr die kurz und gut Reihe sind beim Verlag O&#8217;Reilly erschienen. Seine englischsprachigen Werke &#8222;The C++ Standard Library&#8220; und &#8222;Concurrency with Modern C++&#8220; sind in mehrere Sprachen \u00fcbersetzt worden.<\/p>\n<p><a title=\"Fachinfo_ESE_python3_modernes-c++_grimm\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_python3_modernes-c_grimm.pdf\" target=\"_blank\" rel=\"noopener\"><strong>Beitrag als PDF downloaden<\/strong><\/a><\/p>\n<hr \/>\n<h2>Implementierung &#8211; unsere Trainings &amp; Coachings<\/h2>\n<p><strong>Wollen Sie sich auf den aktuellen Stand der Technik bringen?<\/strong><\/p>\n<p>Dann informieren Sie sich\u00a0<a title=\"MicroConsult Training\" href=\"https:\/\/www.microconsult.de\/alle-trainings-termine-komplettuebersicht\/\" target=\"_blank\" rel=\"noopener\"><strong>hier<\/strong>\u00a0<\/a>zu Schulungen\/ Seminaren\/ Trainings\/ Workshops und individuellen Coachings von MircoConsult zum Thema Implementierung \/Embedded- und Echtzeit-Softwareentwicklung.<\/p>\n<p><strong>Training &amp; Coaching zu den weiteren Themen unseren Portfolios finden Sie\u00a0<a title=\"Training &amp; Beratung - alle Themen\" href=\"https:\/\/www.microconsult.de\/training-beratung\/\" target=\"_blank\" rel=\"noopener\">hier<\/a>.<\/strong><\/p>\n<hr \/>\n<h2>Implementierung &#8211; Fachwissen<\/h2>\n<p>Wertvolles Fachwissen zum Thema Implementierung\/\u00a0Embedded- und Echtzeit-Softwareentwicklung steht\u00a0<a title=\"Embedded- und Echtzeit-Softwareentwicklung\" href=\"https:\/\/www.microconsult.de\/embedded-und-echtzeit-softwareentwicklung\/\" target=\"_blank\" rel=\"noopener\"><strong>hier\u00a0<\/strong><\/a>f\u00fcr Sie zum kostenfreien Download bereit.<\/p>\n<p><a title=\"Embedded- und Echtzeit-Softwareentwicklung\" href=\"https:\/\/www.microconsult.de\/embedded-und-echtzeit-softwareentwicklung\/\" target=\"_blank\" rel=\"noopener\"><strong>Zu den Fachinformationen<\/strong><\/a><\/p>\n<p><strong>Fachwissen zu weiteren Themen unseren Portfolios finden Sie <a title=\"MicroConsult Fachwissen\" href=\"https:\/\/www.microconsult.de\/fachwissen\/\" target=\"_blank\" rel=\"noopener\">hier<\/a>.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warum die Uhr immer lauter tickt Autor: Rainer Grimm, Modernes Beitrag &#8211; Embedded Software Engineering Kongress 2018 Python 3 wurde im Jahr 2008 ver\u00f6ffentlicht. Da Python 3 nicht abw\u00e4rtskompatibel zu Python 2 ist, wurde in der Regel der bestehende Code in Python 2 weiterentwickelt und der neue Code direkt in Python 3 geschrieben. Die Existenz [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-7614","post","type-post","status-publish","format-standard","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Migration auf Python 3 - MicroConsult Academy GmbH<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.microconsult.de\/en\/migration-to-python-3\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Migration auf Python 3 - MicroConsult Academy GmbH\" \/>\n<meta property=\"og:description\" content=\"Warum die Uhr immer lauter tickt Autor: Rainer Grimm, Modernes Beitrag &#8211; Embedded Software Engineering Kongress 2018 Python 3 wurde im Jahr 2008 ver\u00f6ffentlicht. Da Python 3 nicht abw\u00e4rtskompatibel zu Python 2 ist, wurde in der Regel der bestehende Code in Python 2 weiterentwickelt und der neue Code direkt in Python 3 geschrieben. Die Existenz [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microconsult.de\/en\/migration-to-python-3\/\" \/>\n<meta property=\"og:site_name\" content=\"MicroConsult Academy GmbH\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-28T18:03:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-13T18:46:58+00:00\" \/>\n<meta name=\"author\" content=\"weissblau media\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"weissblau media\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/migration-auf-python-3\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/migration-auf-python-3\\\/\"},\"author\":{\"name\":\"weissblau media\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/b6d4c4ae959b068fbe8d9416ed019a0a\"},\"headline\":\"Migration auf Python 3\",\"datePublished\":\"2025-11-28T18:03:42+00:00\",\"dateModified\":\"2026-02-13T18:46:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/migration-auf-python-3\\\/\"},\"wordCount\":2100,\"commentCount\":0,\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/migration-auf-python-3\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/migration-auf-python-3\\\/\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/migration-auf-python-3\\\/\",\"name\":\"Migration auf Python 3 - MicroConsult Academy GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#website\"},\"datePublished\":\"2025-11-28T18:03:42+00:00\",\"dateModified\":\"2026-02-13T18:46:58+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/b6d4c4ae959b068fbe8d9416ed019a0a\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/migration-auf-python-3\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/migration-auf-python-3\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/migration-auf-python-3\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.microconsult.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Migration auf Python 3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#website\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/\",\"name\":\"MicroConsult Academy GmbH\",\"description\":\"Professionelle Schulungen, Beratung und Projektunterst\u00fctzung\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.microconsult.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/b6d4c4ae959b068fbe8d9416ed019a0a\",\"name\":\"weissblau media\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"caption\":\"weissblau media\"},\"sameAs\":[\"https:\\\/\\\/www.microconsult.de\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Migration to Python 3 - MicroConsult Academy GmbH","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.microconsult.de\/en\/migration-to-python-3\/","og_locale":"en_GB","og_type":"article","og_title":"Migration auf Python 3 - MicroConsult Academy GmbH","og_description":"Warum die Uhr immer lauter tickt Autor: Rainer Grimm, Modernes Beitrag &#8211; Embedded Software Engineering Kongress 2018 Python 3 wurde im Jahr 2008 ver\u00f6ffentlicht. Da Python 3 nicht abw\u00e4rtskompatibel zu Python 2 ist, wurde in der Regel der bestehende Code in Python 2 weiterentwickelt und der neue Code direkt in Python 3 geschrieben. Die Existenz [&hellip;]","og_url":"https:\/\/www.microconsult.de\/en\/migration-to-python-3\/","og_site_name":"MicroConsult Academy GmbH","article_published_time":"2025-11-28T18:03:42+00:00","article_modified_time":"2026-02-13T18:46:58+00:00","author":"weissblau media","twitter_card":"summary_large_image","twitter_misc":{"Written by":"weissblau media","Estimated reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microconsult.de\/migration-auf-python-3\/#article","isPartOf":{"@id":"https:\/\/www.microconsult.de\/migration-auf-python-3\/"},"author":{"name":"weissblau media","@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/b6d4c4ae959b068fbe8d9416ed019a0a"},"headline":"Migration auf Python 3","datePublished":"2025-11-28T18:03:42+00:00","dateModified":"2026-02-13T18:46:58+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microconsult.de\/migration-auf-python-3\/"},"wordCount":2100,"commentCount":0,"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microconsult.de\/migration-auf-python-3\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microconsult.de\/migration-auf-python-3\/","url":"https:\/\/www.microconsult.de\/migration-auf-python-3\/","name":"Migration to Python 3 - MicroConsult Academy GmbH","isPartOf":{"@id":"https:\/\/www.microconsult.de\/#website"},"datePublished":"2025-11-28T18:03:42+00:00","dateModified":"2026-02-13T18:46:58+00:00","author":{"@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/b6d4c4ae959b068fbe8d9416ed019a0a"},"breadcrumb":{"@id":"https:\/\/www.microconsult.de\/migration-auf-python-3\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microconsult.de\/migration-auf-python-3\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.microconsult.de\/migration-auf-python-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microconsult.de\/"},{"@type":"ListItem","position":2,"name":"Migration auf Python 3"}]},{"@type":"WebSite","@id":"https:\/\/www.microconsult.de\/#website","url":"https:\/\/www.microconsult.de\/","name":"MicroConsult Academy GmbH","description":"Professional training, consulting and project support","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.microconsult.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/b6d4c4ae959b068fbe8d9416ed019a0a","name":"weissblau media","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","caption":"weissblau media"},"sameAs":["https:\/\/www.microconsult.de"]}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/7614","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/comments?post=7614"}],"version-history":[{"count":6,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/7614\/revisions"}],"predecessor-version":[{"id":11795,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/7614\/revisions\/11795"}],"wp:attachment":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/media?parent=7614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/categories?post=7614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/tags?post=7614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}