Руководство по преобразованию кода 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 с помощью будущее сценарий. Звучит замечательно, но загвоздка в том, что для того, чтобы использовать его по назначению, у конечного пользователя должен быть установлен пакет Python future в его старых установках Maya, или вам нужно предоставить пакет future с вашим кодом.

Наконец, библиотека python-modernize также обеспечивает обратную совместимость и опирается только на встроенные шесть библиотек в качестве уровня совместимости, но вам нужно будет установить 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», которые, по его мнению, не нуждаются в каких-либо исправлениях. Я также добавил пропустить «длинную» функцию, потому что она мешает 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
     — вам потребуется установить его в более ранние версии Maya с помощью pip-установки.
  • Будет работать с 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, и это не проблема, но будущее, встроенные модули и прошлое принадлежат будущей библиотекой и служить тем уровнем совместимости, о котором я упоминал. Вместо того, чтобы напрямую использовать затронутые функции Python (например, zip, диапазон, деление и т. д.), вы используете функции с тем же именем из уровня совместимости, и они будут делать правильные вещи, поэтому вы получите тот же результат, независимо от того, используете ли вы Python. 2 или 3. Эта обратная совместимость имеет свою цену, потому что теперь ваш код зависит от библиотеки future при запуске. Это нормально, если ваш код будет работать только в Maya 2022, но проблема, если вы хотите, чтобы он работал со старыми версиями Maya.

Что я могу сделать для более старых версий Maya?

Для более старых версий Maya вам также нужно установить для них библиотеку future. Как только эта библиотека будет доступна, ваш код будет работать так же, как в Maya 2022, работающем с Python 2. Вы можете установить библиотеку с помощью «pip» следующим образом:

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

Это будет хорошо работать для ваших установок Maya или, если вы можете сделать это для всех членов вашей команды в студийной среде. Если вы поддерживаете библиотеку Python с открытым исходным кодом или публикуете свой код публично, это может стать проблемой. Вы не можете пойти и установить библиотеку future для людей, использующих более старые версии Maya, и вы не можете ожидать, что они сделают это самостоятельно. Вы можете включить библиотеку будущего вместе с вашим кодом, но, возможно, вам лучше подойдет модернизация.

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

Краткое содержание

  • Используйте это для лучшей совместимости со всеми новыми версиями Maya.
  • Преобразует ваш код для совместимости с Python 2 и Python 3.
  • Вам нужно выполнить «pip install» python-modernize, чтобы получить скрипт преобразования.
  • Ваш преобразованный код будет зависеть от пакета Python six, но он включен в 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/

модернизация будет применять исправления так же, как и другие инструменты, но в основном вы просто заметите, что импорт совместимости будет другим.

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

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

Какой бы путь вы ни выбрали, попробуйте запустить преобразование и протестировать свой код. Как я уже упоминал, ни один из них не исправит все, но они сократят количество времени и энергии, которые вам нужно посвятить этому. Протестируйте свой код и исправьте оставшиеся проблемы вручную.

Начните писать модернизированный код Python 2 и, в конечном итоге, Python 3. Это то, над чем вам нужно продолжать работать с новым кодом, который вы пишете. Сначала протестируйте новый код на Python 3, чтобы выработать привычку писать на современном Python 2.

Надеюсь, это поможет вам начать переход на Python 3. Сообщите мне, если вы столкнетесь с какими-либо проблемами при преобразовании или обнаружите какой-либо особенно сложный код, который не преобразуется автоматически. Подпишитесь на меня в Твиттере, чтобы узнать больше о Maya и Python, @maticodes.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.