GNU/Linux >> Tutoriels Linux >  >> Linux

Conversion de votre code Python 2 en Python 3

Python 2 a atteint la fin de vie le 1er janvier 2020. Python 3 est disponible depuis 2008, mais la conversion de 2 à 3 a été lente en raison de dépendances sur des bibliothèques qui n'étaient pas disponibles dans Python 3 initialement, les versions antérieures de python 3 étaient plus lent que python 2 et aussi parce que Python 2 fonctionnait assez bien pour beaucoup de gens. La fin de vie de Python 2 signifie qu'il n'y a plus de versions prises en charge et qu'il n'y a plus de corrections de bogues de Python. Certaines distributions Linux telles qu'Ubuntu et Red Hat prendront en charge Python 2 pendant un certain temps, mais migrer vers Python 3 est une meilleure solution.

Je pensais que Python 3 était rétrocompatible avec Python 2 ?

Pas à 100 %. Le passage de Python 2 à Python 3 a été considéré comme une opportunité de "résoudre" certains problèmes avec Python 2. Parmi eux, la promotion d'Unicode plus uniformément dans tout le langage et la résolution de certains problèmes de syntaxe tels que print étant une instruction plutôt qu'un fonction.

Quelques-unes des différences entre Python 2 et Python 3

Plusieurs instructions telles que print, exec et autres ont été remplacées par des fonctions intégrées. Exemples :

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

La division entière a également été modifiée. Exemple :

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

// a été ajouté à Python 3 pour prendre en charge l'ancien comportement

De nombreuses fonctions renvoient désormais unicode/octets en python 3 au lieu de chaînes ascii/str en python 2. Exemple :

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

Pour convertir le python 3 en une chaîne, vous voudrez utiliser l'option .decode('ascii').

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

Certaines bibliothèques ont été réorganisées.

Par exemple. La bibliothèque python2 urllib2 a été remplacée par urllib dans python 3. Urllib sur Python 3 est également disponible dans des modules tels que urllib.request et urllib.error afin que vous puissiez les importer pour obtenir des fonctionnalités similaires à python 2.

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

Conversion de Python 2 à Python 3 principalement automatiquement

Bien que vous puissiez apporter toutes les modifications pour convertir votre script python de python 2 à python 3 à la main, il existe un outil qui fera une grande partie du travail pour vous. 2to3 est un package installable à partir de la bibliothèque pip et est également disponible en tant que package séparé dans de nombreux référentiels de distributions. A installer via pip3

% pip3 install 2to3

A installer sur Debian/Ubuntu

% sudo apt install 2to3

Pour installer sur Fedora/CentOS

% sudo yum install 2to3

Remarque :l'installation à partir de pip vous donnera la dernière version, tandis que les versions de distribution peuvent être un peu plus anciennes, donc l'installation de pip pourrait mieux fonctionner pour vous.

Courir 2to3

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

Quelques options intéressantes

-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

En supposant que vous ayez un répertoire de code python 2 (scripts) et un dossier de destination pour le code python 3 (scripts3), vous pouvez procéder comme suit :La commande pour effectuer la conversion est la suivante

% 2to3 scripts -n -w -o scripts3

Les options sont les suivantes

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

De cette façon, le code d'origine n'est pas modifié et l'utilisateur peut revoir le code converti dans le dossier scripts3 et toujours se référer également au code d'origine.

Modernize est un wrapper autour de 2to3

Il a un comportement similaire à 2to3 sauf qu'il prend en charge l'indicateur --six-unicode qui utilisera les six fonctions d'assistance qui aident à prendre en charge Python 3.1 et Python 3.2. J'utiliserais probablement 2to3 à moins qu'il n'y ait une fonctionnalité convaincante ajoutée pour moderniser qui vous encouragera à l'utiliser. Modernize est également disponible avec certaines distributions telles que Debian testing et Arch. Pour installer

# pip3 install modernize

Pour courir

# python-modernize --help

Conseils

À faire

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

À ne pas faire

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

Tester, tester, tester

Quelle que soit la manière dont vous convertissez votre code de Python 2 en Python 3, vous devez le tester minutieusement. Pour le code python critique, je suggérerais même d'utiliser le débogueur python pour exécuter le code ligne par ligne.

# python3 -m pdb 

Tapez ensuite n pour passer à la ligne suivante de votre script, et q pour quitter le débogueur.

Conclusion

Python 2 est mort après une vie longue et fructueuse. Si vous utilisez toujours Python 2, vous devez convertir en Python 3. Python fournit un outil en 2to3 qui aide à la conversion de Python 2 en Python 3 et en élimine une grande partie. 2to3 n'est pas un outil parfait, mais il peut faire une grande partie du travail à votre place et réduire la complexité de la conversion de Python 2 à 3 de plusieurs ordres de grandeur.

  • La page 2to3 de la bibliothèque de documentation Python https://docs.python.org/3/library/2to3.html
  • La bibliothèque de modernisation https://pypi.org/project/modernize/
  • Portage du code Python 2 vers la page Python 3 sur python.org https://docs.python.org/3/howto/pyporting.html


Linux
  1. Erreur d'installation de ConfigParser - python setup.py egg_info a échoué avec le code d'erreur 1 [Résolu]

  2. Protégez votre code Java contre l'ingénierie inverse

  3. Importation du module Python depuis Bash

  4. Comment pourrais-je construire moi-même python à partir du code source sur Ubuntu ?

  5. Code Python pour vérifier si le service est en cours d'exécution ou non. ?

Installez les polices Nerd pour ajouter des glyphes dans votre code sous Linux

Comment imprimer une carte de code QR pour se connecter à votre WiFi

Un serveur HTTP Python simple pour votre boîte à outils sysadmin

Détectez les bugs sur votre code en installant SonarQube sur Debian 11

Qu'est-ce que Python :une introduction à un langage de programmation multiplateforme

Comment installer un logiciel à partir du code source dans votre système Linux