GNU/Linux >> Znalost Linux >  >> Linux

Převod kódu Python 2 na Python 3

Python 2 dosáhl konce životnosti 1. ledna 2020. Python 3 je k dispozici od roku 2008, ale převod z 2 na 3 byl pomalý kvůli závislostem na knihovnách, které nebyly původně v Pythonu 3 dostupné, dřívější verze pythonu 3 byly pomalejší než python 2 a také proto, že Python 2 fungoval pro mnoho lidí docela dobře. Python 2 End of Life znamená, že již žádná podporovaná vydání a žádné opravy chyb z Pythonu. Některé distribuce Linuxu, jako je Ubuntu a Red Hat, budou nějakou dobu podporovat Python 2, ale lepší řešení je přechod na Python 3.

Myslel jsem, že Python 3 je zpětně kompatibilní s Pythonem 2?

Ne 100%. Změna z Pythonu 2 na Python 3 byla vzata jako příležitost k „opravě“ některých problémů s Pythonem 2. Mezi nimi byla jednotnější podpora Unicode v celém jazyce a vyjasnění některých problémů v syntaxi, jako je tisk, který je spíše příkazem než funkce.

Několik rozdílů mezi Pythonem 2 a Pythonem 3

Několik příkazů, jako je tisk, exec a další, bylo změněno na vestavěné funkce. Příklady:

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

Celočíselné dělení bylo také změněno. Příklad:

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

// byl přidán do pythonu 3, aby podporoval staré chování

Mnoho funkcí nyní vrací unicode/bajty v pythonu 3 místo řetězců ascii/str v pythonu 2. Příklad:

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

Chcete-li převést python 3 na řetězec, budete chtít použít volbu .decode('ascii').

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

Některé knihovny byly reorganizovány.

Např. Knihovna python2 urllib2 byla nahrazena urllib v pythonu 3. Urllib v Pythonu 3 je k dispozici také v modulech jako urllib.request a urllib.error, takže je můžete importovat a získat podobnou funkci jako python 2.

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

Převod z Pythonu 2 do Pythonu 3 většinou automaticky

I když můžete všechny změny pro převod python skriptu z pythonu 2 na python 3 provést ručně, existuje nástroj, který za vás udělá hodně těžké práce. 2to3 je balíček, který lze nainstalovat z knihovny pip a je také dostupný jako samostatný balíček v mnoha repozitářích distribucí. Instalace přes pip3

% pip3 install 2to3

Instalace na Debian/Ubuntu

% sudo apt install 2to3

Instalace na Fedora/CentOS

% sudo yum install 2to3

Poznámka:Instalací z pipu získáte nejnovější verzi, zatímco distribuční verze mohou být o něco starší, takže instalace pip vám může fungovat lépe.

Běh 2 až 3

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

Několik zajímavých možností

-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

Za předpokladu, že máte adresář kódu python 2 (scripts) a cílovou složku pro kód python 3 (scripts3), můžete provést následující:Příkaz k provedení převodu je následující

% 2to3 scripts -n -w -o scripts3

Možnosti jsou následující

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

Tímto způsobem se původní kód nezmění a uživatel může zkontrolovat převedený kód ve složce scripts3 a stále se také odvolávat na původní kód.

Modernize je obálka kolem 2 až 3

Má podobné chování jako 2to3 kromě toho, že podporuje příznak --six-unicode, který bude používat šest pomocných funkcí, které pomáhají s podporou Pythonu 3.1 a Pythonu 3.2. Pravděpodobně bych použil 2to3, pokud nebude přidána přesvědčivá funkce pro modernizaci, která vás povzbudí k jejímu použití. Modernize je také k dispozici u některých distribucí, jako je Debian testing a Arch. Chcete-li nainstalovat

# pip3 install modernize

Spustit

# python-modernize --help

Tipy

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

Ne

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

Test, Test, Test

Bez ohledu na to, jak převedete svůj kód z Pythonu 2 do Pythonu 3, měli byste jej důkladně otestovat. Pro kritický pythonový kód bych dokonce doporučil použít python debugger ke spuštění kódu řádek po řádku.

# python3 -m pdb 

Poté zadejte n pro přechod na další řádek ve skriptu a q pro ukončení ladicího programu.

Závěr

Python 2 je po dlouhém a plodném životě mrtvý. Pokud stále používáte Python 2, měli byste převést na Python 3. Python poskytuje nástroj v 2to3, který pomáhá s převodem z Pythonu 2 na Python 3 a ubírá z toho spoustu práce. 2to3 není dokonalý nástroj, ale může udělat spoustu práce za vás a snížit složitost převodu z Pythonu 2 na 3 o několik řádů.

  • Stránka 2to3 v knihovně dokumentace Pythonu https://docs.python.org/3/library/2to3.html
  • Modernizace knihovny https://pypi.org/project/modernize/
  • Přenesení kódu Python 2 na stránku Python 3 na adrese python.org https://docs.python.org/3/howto/pyporting.html


Linux
  1. Chyba instalace ConfigParser – python setup.py egg_info se nezdařilo s kódem chyby 1 [Vyřešeno]

  2. Zdrojový kód Netstatu?

  3. One-liner vs Script?

  1. Co je :-!! v C kódu?

  2. Můžeme použít C kód v Pythonu?

  3. Python kód pro kontrolu, zda služba běží nebo ne.?

  1. Chraňte svůj kód Java před zpětným inženýrstvím

  2. Import modulu Python z Bash

  3. Jak bych vytvořil python sám ze zdrojového kódu na Ubuntu?