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
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
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.
Liens
- 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