Ръководство за конвертиране на кода на Maya Python 2 в Python 3.

Python 3 най-накрая е тук в Maya 2022! Ако не сте конвертирали скриптовете си в Python 3, ще разгледам как можете автоматично да конвертирате вашите скриптове и модули на Python 2 в Python 3.

Има МНОГО промени между Python 2 и Python 3 и кодът на Python 3 не е проектиран да бъде обратно съвместим с Python 2. Може да използвате само подмножество от засегнати библиотеки и функции във вашите скриптове на Maya, но вероятно сте все пак ще искате да избегнете ръчното извършване на актуализациите.

Python 3 включва скрипт, наречен 2to3.py, който обработва автоматично конвертирането на вашия код за много от промените, настъпили между Python 2 и Python 3. Разгледайте документацията на 2to3.py който изброява корекциите, които прилага, за да получите представа колко голяма е разликата между Python 2 и Python 3.

Целта ми с тази публикация в блога е да ви помогна да преобразувате кода си възможно най-бързо с най-малко суетене, като същевременно ви покажа някои опции за поддържане на обратна съвместимост с Python 2. Можете да постигнете по-чисти резултати с ръчно преобразуване, но знам, че не винаги е желано или практично. Винаги можете да се върнете и да почистите кода си, когато времето позволява и особено след като спрете поддръжката за Python 2. Препоръчвам да прочетете цялата публикация в блога, преди да започнете, за да разберете какви промени се правят и има няколко сценария, които бихте искали да разгледате.

Трябва ли да използвам 2to3, да го осъвременя или модернизирам?

Както споменахме, Python 3 идва с библиотека, наречена lib2to3, която, както подсказва името, преобразува кода на Python 2 в Python 3. 2to3 се фокусира върху пренасянето на вашия код към Python 3, но не се опитва да го направи обратно съвместим.

От друга страна, Maya 2022 също идва с инсталирана библиотека на бъдещето на python, която използва 2to3 под капака, но може да конвертира вашия код и да го направи обратно съвместим с Python 2 с futurize скрипт. Това звучи чудесно, но уловката е, че за да го използвате по предназначение, вашият краен потребител трябва да има пакета бъдещ python, инсталиран в техните по-стари инсталации на Maya или трябва да предоставите пакета бъдещес вашия код.

И накрая, библиотеката за модернизиране на python също ще ви даде обратна съвместимост и разчита само на вградените шест библиотеки като слой за съвместимост, но ще трябва да инсталирате python-modernize , за да получите достъп до скрипта за преобразуване.

Ще ви покажа как да използвате скриптовете за преобразуване за тези три метода и ще разгледам по-задълбочено предимствата и недостатъците на всеки от тях. Имайте предвид, че никоя от тези библиотеки не е цялостно решение, но ако имате късмет, те ще свършат работата или ще ви отведат по-голямата част от пътя.

Архивиране

Уверете се, че имате резервно копие на кода, който ще конвертирате. Начинът, по който ви показвам как да използвате скриптовете за преобразуване, също ще създаде резервно копие в процеса, но бъдете на сигурно място, не е лошо да запазите друго копие.

2to3

Резюме

  • Използвайте това, ако искате да преминете към Python 3 и да не поглеждате назад или ако възнамерявате да поддържате отделни клонове на Python 2 и Python 3.
  • Без външни зависимости. Вие преобразувате към ванилен код на Python 3.
  • Може да въведете грешки от преобразуването.
    - напр. Ако използвате оператора за деление във 2.7 и кодът ви очаква целочислен резултат, в Python 3 ще получите резултат с плаваща задна буква, което може да причини проблеми.

Първо разглеждаме 2to3, тъй като той е в основата на futurize и modernize, а другите инструменти приемат подобен скриптов интерфейс за изпълнение на преобразуването . Както споменах, 2to3 не се опитва да запази каквато и да е обратна съвместимост, така че няма допълнителен слой за съвместимост като другите инструменти за преобразуване. Той просто извежда чист Python 3. Споменавам този подход само защото някои хора може да имат късмета да преминат към Maya 2022/Python 3 и никога да не поглеждат назад или може да предпочетат да поддържат копие на наследения код на Python 2 и отделен клон с чист Python 3 код. Ето как изглежда командата за преобразуване:

# For a single file or list of files
"C:\Program Files\Autodesk\Maya2022\bin\mayapy.exe" -m lib2to3 --nofix=long -w my_script.py
# To convert all files recursively in a folder
"C:\Program Files\Autodesk\Maya2022\bin\mayapy.exe" -m lib2to3 --nofix=long -w my_directory/

Това ще редактира вашите „.py“ файлове, за да приложи корекциите, но първо ще архивира файловете като „.py.bak“. Той няма да докосва или архивира „.py“ файлове, за които установи, че не се нуждаят от корекции. Добавих също да пропусна функцията „long“, защото това пречи на maya.cmds като maya.cmds.ls(long=True). Откривам, че използвам командата ls по този начин много повече, отколкото използвам типа данни long.

2to3 също извежда към терминала промените, които прави. Редовете с „минус“ в началото са това, което сте имали преди, а редовете с „плюс“ са това, на което е променил кода. Това е добър начин да започнете да се учите да пишете код, съвместим с Python 3. Можете да стартирате без флага „-w“, за да проверите какви промени ще направи, без да пишете нищо.

футуризирам

Резюме

  • Използвайте това, ако се насочвате само към Maya 2022+ или можете да гарантирате, че потребителите ви ще имат инсталиран пакет future за по-стари версии на Maya.
  • Преобразува вашия код, за да бъде съвместим с Python 2 и Python 3
  • Maya 2022 включва пакета python-future за извършване на преобразуването
  • Вашият преобразуван код ще зависи от бъдещия пакет на python
    - Това е включено в Maya 2022
    - Ще трябва да го „инсталирате чрез pip“ в по-стари версии на Maya
  • Ще работи с Maya 2022 от кутията и ‹2022 с някои модификации на по-старите Maya.

Maya 2022 идва с инсталирана библиотека python-future и е налична както в Python 2, така и в Python 3 режими. Autodesk вероятно използва това и го насърчава. Библиотеката python-future идва със скрипт, наречен futurize-script.py, който ще използваме, за да приложим преобразуването, но също така идва с колекция от модули, които служат като слой за съвместимост между Python 2 и Python 3. Нека да разгледаме командата за преобразуване и след това да поговорим повече за кръстосаната съвместимост. Ето как изглежда командата за преобразуване:

# For a single file or list of files
"C:\Program Files\Autodesk\Maya2022\bin\mayapy.exe" "C:\Program Files\Autodesk\Maya2022\Python37\Scripts\futurize-script.py" --nofix=lib2to3.fixes.fix_long -w my_script.py
# To convert all files recursively in a folder
"C:\Program Files\Autodesk\Maya2022\bin\mayapy.exe" "C:\Program Files\Autodesk\Maya2022\Python37\Scripts\futurize-script.py" --nofix=lib2to3.fixes.fix_long -w my_dir/

След извършване на преобразуване може да забележите нови импортирания в горната част на кода си по следния начин:

from __future__ import division
from __future__ import print_function
from future import standard_library
standard_library.install_aliases()
from builtins import zip
from builtins import range
from past.utils import old_div
from builtins import object

__future__ е вградено в Python и няма проблем, но future, builtins и past принадлежат към бъдеща библиотека и служи като този слой за съвместимост, който споменах. Вместо да използвате директно засегнатите функции на Python (напр. zip, диапазон, деление и т.н.), вие използвате функции със същото име от слоя за съвместимост и те ще направят правилното нещо, така че да получите същия резултат, независимо дали използвате Python 2 или 3. Тази обратна съвместимост си има цена, защото сега вашият код зависи от бъдещата библиотека, когато се изпълнява. Това е добре, ако вашият код ще работи само в Maya 2022, но е проблем, ако искате да работи с по-стари версии на Maya.

Какво мога да направя за по-стари версии на Maya?

За по-стари версии на Maya просто трябва да инсталирате бъдещата библиотека и за тях. След като тази библиотека е налична, вашият код ще работи точно както в Maya 2022, работещ с Python 2. Можете да инсталирате библиотеката с помощта на „pip“ по следния начин:

"C:\Program Files\Autodesk\Maya2020\bin\mayapy.exe" -m pip install future

Това ще работи добре за вашите инсталации на Maya или ако можете да го направите за всеки от вашия екип в среда на студио. Ако поддържате библиотека на Python с отворен код или споделяте кода си публично, това може да е проблем. Не можете да отидете и да инсталирате бъдещата библиотека за хора, използващи по-стари версии на Maya, нито можете да очаквате те да го направят сами. Бихте могли да включите бъдещата библиотека С кода си, но може би модернизирането е по-добра опция за вас.

модернизират

Резюме

  • Използвайте това за най-добра съвместимост с всички по-нови версии на Maya.
  • Преобразува вашия код, за да бъде съвместим с Python 2 и Python 3
  • Трябва да „pip install“ python-modernize, за да получите скрипта за преобразуване.
  • Вашият конвертиран код ще зависи от пакета six python, но той е включен в Python 2 и Python 3.
  • Ще работя с всички по-нови версии на Maya.

Библиотеката python-modernize се опитва да постигне кръстосана съвместимост като python-future, но не зависи от външен слой за съвместимост. Вместо това той използва шестте модула като свой слой за съвместимост, който идва вграден с най-новите версии на Python 2 и с Python 3. Просто трябва да инсталирате modernize, за да получите достъп до скрипта за преобразуване. Можете да инсталирате modernize във всеки интерпретатор на Python. Не е необходимо да се инсталира в Python интерпретатора на Maya, но ако това е всичко, което имате, ето как да го направите:

"C:\Program Files\Autodesk\Maya2022\bin\mayapy.exe" -m pip install modernize

След като инсталирате modernize, вие го използвате точно като другите скриптове за преобразуване:

# For a single file or list of files
"C:\Program Files\Autodesk\Maya2022\bin\mayapy.exe" -m modernize -x fissix.fixes.fix_long -w my_script.py
# To convert all files recursively in a folder
"C:\Program Files\Autodesk\Maya2022\bin\mayapy.exe" -m modernize -x fissix.fixes.fix_long -w my_dir/

modernize ще приложи корекции точно като другите инструменти, но най-вече просто ще забележите, че импортиранията за съвместимост ще бъдат различни.

from six.moves import range
from six.moves import zip

Последни мисли

Който и маршрут да изберете, опитайте да стартирате преобразуването и да тествате кода си. Както споменах, нито едно от тях няма да поправи всичко, но ще намалят времето и енергията, които ще трябва да посветите на това. Тествайте кода си и коригирайте останалите проблеми ръчно.

Започнете да пишете модернизиран Python 2 и евентуално Python 3 код. Това е нещо, върху което ще трябва да продължите да работите с новия код, който пишете. Тествайте първо нов код в Python 3, за да придобиете навик да пишете модерен Python 2.

Надяваме се, че това ще ви помогне да започнете да мигрирате към Python 3. Уведомете ме, ако срещнете някакви проблеми при преобразуването или откриете някакъв особено труден код, който не се преобразува автоматично. Последвайте ме в Twitter за повече съдържание относно Maya и Python, @maticodes.

Повече съдържание в plainenglish.io. Регистрирайте се за нашия безплатен седмичен бюлетин тук.