Рубрики
Без рубрики

Как мигрировать проекты Python 2 на 3 и некоторые полезные советы

Python 2.7 подошел к концу жизни в январе 2020 года, и даже до этого множества программных миграций в PYT … Tagged с Python, Python3, миграция, 2to3.

Python 2.7 подошел к концу жизни в январе 2020 года, и даже до того, как произошла эта лочка миграции программного обеспечения на Python 3. Тем не менее, я немного опаздывал на вечеринку и приступил к работе над одним таким проектом в конце 2020 года. Поэтому в этом блоге я постараюсь подвести итог, какие шаги мы выполняли, и некоторые из советов, которые могут быть полезны для коллег -разработчика, которому, возможно, потребуется мигрировать проект Python в будущем.

Прежде чем мы начнем, позвольте мне также добавить небольшой отказ от ответственности, что я не буду касаться различий в Python 2 и 3, в Интернете много контента, так что, пожалуйста, не стесняйтесь проверить это Анкет

Мы будем говорить о миграции, где мы не беспокоились о совместимости Python2, потому что это имело место с нами. Тем не менее, я также поделюсь некоторыми ссылками для совместимых с PY2 и 3. Итак, давайте начнем и посмотрим, какие шаги можно выполнить, когда должна быть сделана миграция в Python 3. Мы мигрировали с Python 2,7 на 3,7, но последняя версия 3,9 Так что, если вы достаточно уверены в том, чтобы выбрать последнюю версию Python, вы также можете это сделать.

Шаги для миграции

  • Первым шагом было бы понять некоторую фундаментальную разницу между Python 2 и 3, которые помогут решить проблемы
  • Проверьте покрытие кода кода и убедитесь, что у нас есть приличное покрытие теста. Чем больше покрытие кода, тем легче будет переносить код
  • Установите виртуальную среду для версий Python2.7 и Python 3.7+

Virtual Env для Python2

python2.7 -m  pip install virtualenv
python2.7 -m virtualenv py27
source py27/bin/activate

Virtual Env для Python3

python3.7 -m virtualenv py3
source py3/bin/activate
  • Кроме того, создайте отдельную филиал для кодовой базы Python 3 и сохраните эти две версии, параллели, если не будет завершена полная миграция
  • Следующие шаги должны заключаться в том, чтобы выяснить зависимости кодовой базы, совместимая с Python 3, чтобы я порекомендовал использовать следующий инструмент

    • canisepython3 : Это помогает выяснить, какие существующие зависимости совместимы с Python3

    • Pip-Tools : Когда мы мигрируем, и мы также можем беспокоиться о том, чтобы закрепить зависимости и подразделы, то Pip-Tools очень удобно, изучите это

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

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

  • В нашем случае мы использовали библиотеку под названием Futurize который также основан на 2to3

  • Мы можем использовать ниже команду для автоматической конверта кода в Python 3

  • После того, как код будет автоматически преобразован, запустите тестовые примеры и проверьте количество сбоев и начните их исправлять

  • После того, как тестовые случаи зафиксированы, мы можем продолжить с нашим функциональным тестированием, регрессионными тестированием и обновлениями конвейера CI

Примечание – при исправлении функциональных тестовых случаев будет удобно иметь версию Python 2 и Python 3, работающих в двух виртуальных веществах Diff, потому что тогда мы можем перейти к двум версиям и увидеть изменение поведения, если мы застрял, исправляя ошибку

Немногие получают

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

  • Авто-конверсия в конечном итоге добавит встроенную функцию списка ко всем таким случаям, когда мы могли бы использовать dict.iteritems () , после преобразования это становится список (dict.items ()) Потому что итерации Возвращает список В Python 2.7 и в Python 3 он возвращает Анкет Тем не менее, это ненужный вызов, потому что преобразование в список требует времени, и вы все еще можете выполнить через dict.items () Точно так же, как вы делаете из конвертированного списка
  • Futurize также может добавить много неиспользованного импорта в вашу кодовую базу, мы можем избавиться от них, если мы не беспокоимся о обратной совместимости, но помните о том, чтобы не удалять весь неиспользованный импорт и проверить и проанализировать модуль перед этим
  • Если бы вы использовали функцию ZIP в Python 2.7, а затем попытались преобразовать ее, чтобы DICT, тогда Futurize может завершить Zip с список Функциональный вызов, вам не понадобится это list () Функциональный вызов в большинстве случаев после перехода на Python 3
all_vals = dict(list(zip(array1, array2))) # Unnecessary list function call
all_vals = dict(zip(array1, array2)) # Correct
  • Относительный импорт больше не поддерживается в Python 3. Любой код, который использовал относительный импорт в Python 2, теперь должен быть изменен для поддержки абсолютного импорта
  • В Python2, CSV Файлы должны открываться в двоичном режиме. Но в Python 3 файлы должны быть открыты в текстовом режиме

Общие исправления ошибки

Таким образом, во время миграции мы можем в конечном итоге исправить некоторые очень основные ошибки уровня, которые могут быть введены из -за футуристических или из -за различий Python 2 и 3. Итак, я перечисляю немногие из них, с которыми мы столкнулись, и это может помочь вам быстро избавиться от них –

  • Старое подразделение не будет работать в Python3, и мы можем исправить такие случаи
from past.utils import old_div
x = y / 1000 # Would give unexpected result in Python 3 and existing test case may fail because of this
x = old_div(y, 1000) # This would result as Python 2
  • Во всех случаях обработки исключений мы могли бы получить эту общую ошибку, в которой Python 2 у нас был атрибут, называемый сообщением для класса исключений, а Python 3 не имеет его
# Old case
except Exception as e:
    raise CustomError(message="message: {}".format(e.message))

# How to fix
except Exception as e:
    raise CustomError(message="message: {}".format(e))
  • Для тех же ошибок обработки исключений при удалении атрибута сообщения из е - переменная, чем в некоторых случаях, мы могли бы столкнуться ниже ошибкой, где мы будем выполнять операцию CONCAT на e и какая -то строка, которая вызовет неудачу
# Failure case
try:
    1/0
except Exception as e:
    print("custom_message"+e) # This would give an error
# How to fix
try:
    1/0
except Exception as e:
    print("custom_message"+str(e))
  • hasattr (dict, 'iteritems') вернется Ложный в Python 3, чтобы исправить, пожалуйста, используйте это
hasattr(dict,'items') 
  • В Python 2 мы использовали для использования string.replace () Кроме того, в SomeCases, чтобы заменить строку внутри строки, это не будет работать в Python 3, следовательно, исправите ее так –
a = "asdfghj"
string.replace(a, "asd", "xcv") # Will not work
a.replace("asd", "xcv") # correct
  • cmp () Функция, которая раньше была доступна в Python 2, недоступна в Python 3, поэтому вам может потребоваться реализовать что -то подобное, чтобы исправить ошибки –
def cmp(a, b):
    return (a > b) - (a < b) 

Вывод

Я надеюсь, что эта информация была полезна для вас, и я также надеюсь, что это может ускорить ваше время миграции. В целом, я также должен признаться, что, несмотря на то, что шаги миграции кажутся довольно простыми, но весь процесс может быть утомительным из -за того, что снова и снова исправляют некоторые общие ошибки. Если вы можете быстро исправить эти небольшие ошибки, вы можете сосредоточиться на функциональной части миграции, которая является наиболее важной. Итак, именно поэтому я попытался перечислить некоторые из общих проблем, с которыми я столкнулся во время миграции, надеюсь, это может быть полезно для кого -то. Спасибо за чтение и не стесняйтесь поделиться любыми отзывами в разделе комментариев.

Использованная литература:

https://wiki.openstack.org/wiki/Python3#Port_Python_2_code_to_Python_3 http://python3porting.com/ https://docs.python.org/dev/howto/pyporting.html https://python-future.org/quickstart.html https://python-future.org/quickstart.html#to-convert-existing-python-2-code (На совместимости Python 2)

Отказ от ответственности: это личный [блог, пост, заявление, мнение]. Взгляды и мнения, выраженные здесь, являются только мнением автора и не представляют взгляды какой -либо организации или любого человека, с которым автор может быть связан, профессионально или лично.

Оригинал: “https://dev.to/epamindia/how-to-migrate-python-2-projects-to-3-some-useful-tips-1kid”