GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Konvertieren Ihres Python 2-Codes in 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 zu 3 war langsam, da Abhängigkeiten von Bibliotheken vorhanden waren, die ursprünglich nicht in Python 3 verfügbar waren, frühere Versionen von Python 3 waren es langsamer als Python 2 und auch, weil Python 2 für viele Leute recht gut funktionierte. Das Ende des Lebenszyklus von Python 2 bedeutet keine unterstützten Releases mehr und keine Fehlerbehebungen von Python. Einige Linux-Distributionen wie Ubuntu und Red Hat werden Python 2 für einige Zeit unterstützen, aber die Migration zu Python 3 ist eine bessere Lösung.

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

Nicht 100%. Der Wechsel von Python 2 zu Python 3 wurde zum Anlass genommen, einige Probleme mit Python 2 zu „beheben“. Darunter die einheitlichere Förderung von Unicode in der gesamten Sprache und die Klärung einiger Probleme in der Syntax, wie z Funktion.

Einige 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 ganzzahlige 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 anstelle von 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- in eine Zeichenfolge 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. Die Python2-Bibliothek urllib2 wurde in Python 3 durch die urllib ersetzt. Urllib in Python 3 ist auch in Modulen wie urllib.request und urllib.error verfügbar, sodass Sie sie importieren können, um eine ähnliche Funktionalität wie in Python 2 zu erhalten.

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

Konvertieren von Python 2 zu Python 3 größtenteils automatisch

Während Sie alle Änderungen vornehmen können, um Ihr Python-Skript von Hand von Python 2 nach Python 3 zu konvertieren, gibt es ein Tool, das Ihnen viel Arbeit abnimmt. 2to3 ist ein Paket, das aus der Pip-Bibliothek installiert werden kann und auch als separates Paket in vielen Distributions-Repositories verfügbar ist. Über Pip3 zu installieren

% pip3 install 2to3

Zur Installation unter Debian/Ubuntu

% sudo apt install 2to3

Zur Installation unter Fedora/CentOS

% sudo yum install 2to3

Hinweis:Durch die Installation von Pip erhalten Sie die neueste Version, während die Distributionsversionen möglicherweise etwas älter sind, sodass die Pip-Installation für Sie möglicherweise besser funktioniert.

Laufen 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 (Scripts) und einen Zielordner für den Python 3-Code (Scripts3), können Sie Folgendes tun:Der Befehl zum Ausführen der Konvertierung lautet wie folgt

% 2to3 scripts -n -w -o scripts3

Optionen sind wie folgt

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 scripts3-Ordner überprüfen und sich auch weiterhin auf den Originalcode beziehen.

Modernize ist ein Wrapper um 2to3

Es hat ein ähnliches Verhalten wie 2to3, außer dass es das Flag --six-unicode 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 wird eine überzeugende Funktion zur Modernisierung hinzugefügt, die Sie dazu ermutigt, es zu verwenden. Modernize ist auch mit einigen Distributionen wie Debian Testing und Arch verfügbar. Zum Installieren

# pip3 install modernize

Laufen

# 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

Verbote

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

Testen, testen, testen

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

# python3 -m pdb 

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

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 in 2to3 ein Tool zur Verfügung, das bei der Konvertierung von Python 2 zu Python 3 hilft und viel Laufarbeit abnimmt. 2to3 ist kein perfektes Tool, aber es kann Ihnen einen Großteil der Arbeit abnehmen und die Komplexität der Konvertierung von Python 2 nach 3 um mehrere Größenordnungen reduzieren.

  • Die 2to3-Seite in der Python-Dokumentationsbibliothek https://docs.python.org/3/library/2to3.html
  • Die Modernisierungsbibliothek https://pypi.org/project/modernize/
  • Porting Python 2 Code to Python 3 page at python.org https://docs.python.org/3/howto/pyporting.html


Linux
  1. ConfigParser-Installationsfehler – python setup.py egg_info fehlgeschlagen mit Fehlercode 1 [Gelöst]

  2. Quellcode von Netstat?

  3. Einzeiler vs. Drehbuch?

  4. Schützen Sie Ihren Java-Code vor Reverse Engineering

  5. Was ist :-!! im C-Code?

Installieren Sie Nerd-Schriftarten, um Glyphen in Ihrem Code unter Linux hinzuzufügen

So drucken Sie eine QR-Code-Karte für die Verbindung zu Ihrem WLAN

Ein einfacher Python-HTTP-Server für Ihre Sysadmin-Toolbox

Erkennen Sie Fehler in Ihrem Code, indem Sie SonarQube auf Debian 11 installieren

Was ist Python:Eine Einführung in eine plattformübergreifende Programmiersprache

So installieren Sie Software aus dem Quellcode in Ihrem Linux-System