Konvertieren von Python-2-Code zu Python 3

Python 2 hat am 1. Januar 2020 das Ende seiner Lebensdauer erreicht. Python 3 ist seit 2008 verfügbar, aber die Konvertierung von 2 auf 3 verlief aufgrund von Abhängigkeiten von Bibliotheken, die ursprünglich nicht in Python 3 verfügbar waren, langsamer als Python 2 und auch, weil Python 2 für viele Leute recht gut funktionierte. Das Python 2 End of Life bedeutet, dass es keine unterstützten Versionen mehr gibt und keine Fehlerbehebungen von Python. Einige Linux-Distributionen wie Ubuntu und Red Hat werden Python 2 noch einige Zeit unterstützen, aber die Migration auf Python 3 ist eine bessere Lösung.

Ich dachte, Python 3 sei abwärtskompatibel mit Python 2?

Nicht zu 100 %. Der Wechsel von Python 2 zu Python 3 wurde zum Anlass genommen, einige Probleme mit Python 2 zu „beheben“. Dazu gehörte die einheitlichere Förderung von Unicode in der gesamten Sprache und die Klärung einiger Probleme in der Syntax, wie z.B., dass Print eine Aussage und keine Funktion ist.

Ein paar der Unterschiede zwischen Python 2 und Python 3

Mehrere Anweisungen wie print, exec und andere wurden in eingebaute Funktionen geändert. Beispiele:

print 'hello world' # valid python 2 not in python 3
print ('hello world') # valid python 3 and later versions of python 2

Die Ganzzahl-Division wurde ebenfalls geändert. Beispiel:

print (5 / 2) # in python 2 result is 2 in python 3 result is 2.5

// wurde zu Python 3 hinzugefügt, um altes Verhalten zu unterstützen

Viele Funktionen geben jetzt Unicode/Bytes in Python 3 statt ascii/str-Strings in Python 2 zurück. Beispiel:

type (subprocess.checkout_output('cmd')) # returns <class 'bytes'> <class 'bytes'=""> in python 3 vs <type 'str'><type 'str'=""> in python 2

Um die Python 3 <class ‚bytes‘><class ‚bytes’=““> in eine Zeichenkette zu konvertieren, sollten Sie die Option .decode(‚ascii‘) verwenden.

type (subprocess.check_output('ls').decode('ascii')) # will result in a <class 'str'><class 'str'=""> in python 3

Einige Bibliotheken wurden neu organisiert.

Z.B. wurde die python2-Bibliothek urllib2 in Python 3 durch die urllib ersetzt. Die Urllib auf Python 3 ist auch in Modulen wie urllib.request und urllib.error verfügbar, so dass Sie diese importieren können, um ähnliche Funktionalität wie in Python 2 zu erhalten.

from urllib import urlopen # python 2
from urllib.request import urlopen # python 3

Konvertierung von Python 2 nach Python 3 weitgehend automatisch

Sie können zwar alle Änderungen zur Konvertierung Ihres Python-Skripts von Python 2 nach Python 3 von Hand vornehmen, aber es gibt ein Werkzeug, das Ihnen einen Großteil der schweren Arbeit abnimmt. 2to3 ist ein Paket, das aus der pip-Bibliothek installiert werden kann und auch als separates Paket in vielen Repositories der Distributionen verfügbar ist. So installieren Sie über pip3

% pip3 install 2to3

Zur Installation unter Debian/Ubuntu

% sudo apt install 2to3

Auf Fedora/CentOS zu installieren

% sudo yum install 2to3

Anmerkung: Die Installation von pip bringt Ihnen die neueste Version, während die Distributionsversionen etwas älter sein können, so dass die Pip-Installation für Sie vielleicht besser funktioniert.

Ausführen von 2to3

$ 2to3 --help # will provide you the help message from the system

Ein paar interessante Optionen

-l                  # will provide a list of the fixes available in 2to3.  E.g. print, exec, urllib, and others
-x                  # explicitly not run a transformation, use if one of the "fixes" doesn't work for your code base
-o                  # output dir, put transformed files into another location
--add-suffix=SUFFIX # put a suffix on converted files --add-suffix='3', will convert .py files to .py3 files
-w                  # overwrite current files with modified files

Angenommen, Sie haben ein Verzeichnis mit Python-2-Code (Skripte) und einen Zielordner für den Python-3-Code (Skripte3), dann können Sie Folgendes tun: Der Befehl für die Konvertierung lautet wie folgt

% 2to3 scripts -n -w -o scripts3

Folgende Optionen stehen zur Auswahl

scripts  - source dir
-n       - no backups
-w       - write-unchanged files, write file even if no changes are required by 2to3
-o       - output directory
scripts3 - output directory, where the converted scripts are written

Auf diese Weise wird der Originalcode nicht verändert, und der Benutzer kann den konvertierten Code im Ordner scripts3 überprüfen und trotzdem auf den Originalcode verweisen.

Modernisieren ist ein Wrapper um 2to3

Es hat ein ähnliches Verhalten wie 2to3, außer dass es das –six-unicode-Flag unterstützt, das die sechs Hilfsfunktionen verwendet, die bei der Unterstützung von Python 3.1 und Python 3.2 helfen. Ich würde wahrscheinlich 2to3 verwenden, es sei denn, es wurde eine zwingende Funktion zur Modernisierung hinzugefügt, die Sie dazu ermutigt, sie zu verwenden. Modernisieren ist auch bei einigen Distributionen wie Debian Testing und Arch. Zur Installation

# pip3 install modernize

Zum Ausführen

# python-modernize --help

Tipps

Dos

Do conversion in small chunks
Do use tools like pylint to help you figure out problematic code, before you convert it
Do compare the code before and after the conversion
Do use the debugger to validate critical code

Tabus

Do not overwrite your code with 2to3, recommend a separate directory
Do not trust in the tools to do everything correctly

Test, Test, Test

Unabhängig davon, wie Sie Ihren Code von Python 2 nach Python 3 konvertieren, sollten Sie ihn gründlich testen. Für unternehmenskritischen Python-Code würde ich sogar vorschlagen, den Python-Debugger zu verwenden, um den Code Zeile für Zeile auszuführen.

# python3 -m pdb  # will run the script in the python debugger

Geben Sie dann n ein, um zur nächsten Zeile in Ihrem Skript zu gelangen, und q, um den Debugger zu verlassen.

Schlussfolgerung

Python 2 ist nach einem langen und fruchtbaren Leben tot. Wenn Sie noch Python 2 verwenden, sollten Sie zu Python 3 konvertieren. Python stellt mit 2to3 ein Werkzeug zur Verfügung, das bei der Konvertierung von Python 2 nach Python 3 hilft und einen großen Teil der Lauferei abnimmt. 2to3 ist kein perfektes Werkzeug, aber es kann einen Großteil der Arbeit für Sie erledigen und die Komplexität der Konvertierung von Python 2 nach 3 um mehrere Größenordnungen reduzieren.

Links

Das könnte dich auch interessieren …