GNU/Linux >> Tutoriales Linux >  >> Linux

Convertir su código de Python 2 a Python 3

Python 2 llegó al final de su vida útil el 1 de enero de 2020. Python 3 ha estado disponible desde 2008, pero la conversión de 2 a 3 ha sido lenta debido a las dependencias de las bibliotecas que inicialmente no estaban disponibles en Python 3, las versiones anteriores de python 3 fueron más lento que Python 2 y también porque Python 2 funcionaba bastante bien para muchas personas. El final de la vida útil de Python 2 significa que no habrá más versiones compatibles ni correcciones de errores de Python. Algunas distribuciones de Linux, como Ubuntu y Red Hat, serán compatibles con Python 2 durante algún tiempo, pero migrar a Python 3 es una mejor solución.

¿Pensé que Python 3 era compatible con versiones anteriores de Python 2?

No 100%. El cambio de Python 2 a Python 3 se tomó como una oportunidad para "arreglar" algunos problemas con Python 2. Entre ellos, promover Unicode de manera más uniforme en todo el lenguaje y aclarar algunos problemas en la sintaxis, como que la impresión sea una declaración en lugar de un función.

Algunas de las diferencias entre Python 2 y Python 3

Varias declaraciones como print, exec y otras se han cambiado a funciones integradas. Ejemplos:

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

La división de enteros también se ha cambiado. Ejemplo:

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

// se ha agregado a python 3 para admitir el comportamiento antiguo

Muchas funciones ahora devuelven unicode/bytes en python 3 en lugar de cadenas ascii/str en python 2. Ejemplo:

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

Para convertir python 3 en una cadena, querrá usar la opción .decode('ascii').

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

Algunas bibliotecas han sido reorganizadas.

P.ej. La biblioteca python2 urllib2 se reemplazó con urllib en python 3. Urllib en Python 3 también está disponible en módulos como urllib.request y urllib.error para que pueda importarlos y obtener una funcionalidad similar a python 2.

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

Convertir de Python 2 a Python 3 principalmente de forma automática

Si bien puede realizar todos los cambios para convertir su secuencia de comandos de python de python 2 a python 3 a mano, hay una herramienta que hará gran parte del trabajo pesado por usted. 2to3 es un paquete que se puede instalar desde la biblioteca pip y también está disponible como un paquete separado en muchos repositorios de distribución. Para instalar a través de pip3

% pip3 install 2to3

Para instalar en Debian/Ubuntu

% sudo apt install 2to3

Para instalar en Fedora/CentOS

% sudo yum install 2to3

Nota:la instalación desde pip le proporcionará la última versión, mientras que las versiones de distribución pueden ser un poco más antiguas, por lo que la instalación de pip podría funcionar mejor para usted.

Corriendo 2to3

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

Un par de opciones interesantes

-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

Suponiendo que tiene un directorio de código python 2 (scripts) y una carpeta de destino para el código python 3 (scripts3), puede hacer lo siguiente:El comando para realizar la conversión es el siguiente

% 2to3 scripts -n -w -o scripts3

Las opciones son las siguientes

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 esta forma, el código original no se modifica y el usuario puede revisar el código convertido en la carpeta scripts3 y seguir consultando también el código original.

Modernize es un contenedor alrededor de 2to3

Tiene un comportamiento similar a 2to3 excepto que admite el indicador --six-unicode que utilizará las seis funciones auxiliares que ayudan con la compatibilidad con Python 3.1 y Python 3.2. Probablemente usaría 2to3 a menos que se agregue una función atractiva para modernizar que lo anime a usarla. Modernize también está disponible con algunas distribuciones como Debian testing y Arch. Para instalar

# pip3 install modernize

Para correr

# python-modernize --help

Consejos

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

No hacer

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

Prueba, Prueba, Prueba

Independientemente de cómo convierta su código de Python 2 a Python 3, debe probarlo a fondo. Para el código python de misión crítica, incluso sugeriría usar el depurador de python para ejecutar el código línea por línea.

# python3 -m pdb 

Luego escriba n para ir a la siguiente línea en su secuencia de comandos y q para salir del depurador.

Conclusión

Python 2 está muerto después de una vida larga y fructífera. Si todavía usa Python 2, debe convertir a Python 3. Python proporciona una herramienta en 2to3 que ayuda con la conversión de Python 2 a Python 3 y le quita mucho trabajo. 2to3 no es una herramienta perfecta, pero puede hacer mucho del trabajo por usted y reducir la complejidad de convertir de Python 2 a 3 en varios órdenes de magnitud.

Enlaces

  • La página 2to3 en la biblioteca de documentación de Python https://docs.python.org/3/library/2to3.html
  • La biblioteca de modernización https://pypi.org/project/modernize/
  • Portación del código de Python 2 a la página de Python 3 en python.org https://docs.python.org/3/howto/pyporting.html


Linux
  1. Error de instalación de ConfigParser:python setup.py egg_info falló con el código de error 1 [Resuelto]

  2. ¿Código fuente de Netstat?

  3. Proteja su código Java de la ingeniería inversa

  4. Importación del módulo Python desde Bash

  5. ¿Cómo construiría python yo mismo a partir del código fuente en Ubuntu?

Instale fuentes Nerd para agregar glifos en su código en Linux

Cómo imprimir una tarjeta de código QR para conectarse a su WiFi

Un servidor HTTP de Python simple para su caja de herramientas de administrador de sistemas

Detecta errores en tu código instalando SonarQube en Debian 11

Qué es Python:una introducción a un lenguaje de programación multiplataforma

Cómo instalar software desde el código fuente en su sistema Linux