GNU/Linux >> Linux Esercitazione >  >> Linux

Conversione del codice Python 2 in Python 3

Python 2 ha raggiunto la fine del suo ciclo di vita il 1 gennaio 2020. Python 3 è disponibile dal 2008, ma la conversione da 2 a 3 è stata lenta a causa delle dipendenze dalle librerie che inizialmente non erano disponibili in Python 3, le versioni precedenti di Python 3 erano più lento di Python 2 e anche perché Python 2 funzionava abbastanza bene per molte persone. Python 2 End of Life significa niente più versioni supportate e nessuna correzione di bug da Python. Alcune distribuzioni Linux come Ubuntu e Red Hat supporteranno Python 2 per qualche tempo, ma la migrazione a Python 3 è una soluzione migliore.

Pensavo che Python 3 fosse retrocompatibile con Python 2?

Non al 100%. Il passaggio da Python 2 a Python 3 è stato colto come un'opportunità per "risolvere" alcuni problemi con Python 2. Tra questi, la promozione di Unicode in modo più uniforme in tutto il linguaggio e per chiarire alcuni problemi nella sintassi come print essendo un'istruzione piuttosto che un funzione.

Alcune delle differenze tra Python 2 e Python 3

Diverse istruzioni come print, exec e altre sono state modificate in funzioni integrate. Esempi:

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

Anche la divisione intera è stata modificata. Esempio:

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

// è stato aggiunto a Python 3 per supportare il vecchio comportamento

Molte funzioni ora restituiscono unicode/bytes in python 3 invece di stringhe ascii/str in python 2. Esempio:

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

Per convertire python 3 in una stringa, dovrai usare l'opzione .decode('ascii').

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

Alcune biblioteche sono state riorganizzate.

Per esempio. La libreria python2 urllib2 è stata sostituita con urllib in python 3. Urllib su Python 3 è disponibile anche in moduli come urllib.request e urllib.error, quindi puoi importarli per ottenere funzionalità simili a python 2.

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

Conversione da Python 2 a Python 3 per lo più Automaticamente

Mentre puoi apportare tutte le modifiche per convertire il tuo script python da python 2 a python 3 a mano, c'è uno strumento che farà gran parte del lavoro pesante per te. 2to3 è un pacchetto installabile dalla libreria pip ed è anche disponibile come pacchetto separato in molti repository di distribuzioni. Per installare tramite pip3

% pip3 install 2to3

Per installare su Debian/Ubuntu

% sudo apt install 2to3

Per installare su Fedora/CentOS

% sudo yum install 2to3

Nota:l'installazione da pip ti darà l'ultima versione, mentre le versioni di distribuzione potrebbero essere un po' più vecchie, quindi l'installazione di pip potrebbe funzionare meglio per te.

Correndo 2to3

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

Un paio di opzioni interessanti

-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

Supponendo che tu abbia una directory di codice python 2 (script) e una cartella di destinazione per il codice python 3 (scripts3) puoi fare quanto segue:Il comando per eseguire la conversione è il seguente

% 2to3 scripts -n -w -o scripts3

Le opzioni sono le seguenti

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

In questo modo il codice originale non viene modificato e l'utente può rivedere il codice convertito nella cartella scripts3 e continuare a fare riferimento anche al codice originale.

Modernize è un wrapper attorno a 2to3

Ha un comportamento simile a 2to3 tranne per il fatto che supporta il flag --six-unicode che utilizzerà le sei funzioni di supporto che aiutano con il supporto di Python 3.1 e Python 3.2. Probabilmente userei 2to3 a meno che non ci sia una caratteristica interessante aggiunta per modernizzare che ti incoraggi a usarlo. Modernize è disponibile anche con alcune distribuzioni come Debian testing e Arch. Per installare

# pip3 install modernize

Per correre

# python-modernize --help

Suggerimenti

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

Da non fare

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

Test, test, test

Indipendentemente da come converti il ​​tuo codice da Python 2 a Python 3, dovresti testarlo a fondo. Per il codice Python mission-critical suggerirei persino di utilizzare il debugger Python per eseguire il codice riga per riga.

# python3 -m pdb 

Quindi digita n per passare alla riga successiva nello script e q per uscire dal debugger.

Conclusione

Python 2 è morto dopo una vita lunga e fruttuosa. Se stai ancora utilizzando Python 2, dovresti convertire in Python 3. Python fornisce uno strumento in 2to3 che aiuta con la conversione da Python 2 a Python 3 e ne elimina gran parte del lavoro. 2to3 non è uno strumento perfetto, ma può fare molto lavoro per te e ridurre la complessità della conversione da Python 2 a 3 di diversi ordini di grandezza.

  • La pagina 2to3 nella libreria della documentazione di Python https://docs.python.org/3/library/2to3.html
  • La libreria modernize https://pypi.org/project/modernize/
  • Portare il codice Python 2 nella pagina Python 3 su python.org https://docs.python.org/3/howto/pyporting.html


Linux
  1. Errore di installazione di ConfigParser – python setup.py egg_info non riuscito con codice di errore 1 [Risolto]

  2. Codice sorgente di Netstat?

  3. Script contro una riga?

  4. Proteggi il tuo codice Java dal reverse engineering

  5. Cos'è :-!! in codice C?

Installa i caratteri Nerd per aggiungere glifi nel tuo codice su Linux

Come stampare la scheda QR Code per la connessione al WiFi

Un semplice server HTTP Python per la tua cassetta degli attrezzi di amministratore di sistema

Rileva i bug sul tuo codice installando SonarQube su Debian 11

Cos'è Python:un'introduzione a un linguaggio di programmazione multipiattaforma

Come installare il software dal codice sorgente nel tuo sistema Linux