Как импортировать программы, написанные на других версиях Python? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть сценарий python, написанный на Python 2.7, но я хочу импортировать его в сценарий python, написанный на 3.5, как мне убедиться, что скрипт python знает, какую версию python использовать для чтения сценария?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы не можете просто импортировать код Python 2, если он не был специально написан для совместимости с Python 2/3 (что не редкость).

Обычная рекомендация - обновить скрипт Python 2 доPython 3, если он не может быть запущен Python 3. Стандартная библиотека 2to3 может помочь с этим, и существуют сторонние инструменты, которые могут сделать это еще проще, например python-future Для краткостискрипт, я бы поддержал эту рекомендацию.

Однако, это не только способ.

Второй вариант: вы можете запустить скрипт Python 2 под Python 2 внутриподпроцесс, запущенный из Python 3. Вы можете обмениваться данными между процессами, используя сериализованные данные, такие как JSON или более старый протокол pickle.Это влечет за собой написание некоторого связующего кода в Python 2, чтобы помочь передавать данные назад и вперед.Если вам нужен небольшой интерфейс для большой программы на Python 2, это может быть проще, чем обновить все до Python 3.

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

И, наконец, вы можете использовать инструмент для автоматического преобразования скрипта в Python 3 при импорте, например, lib2to3import .Это, вероятно, ближе всего к тому, что вы просили, но я не нашел такие инструменты, чтобы быть очень надежным.Этот подход на самом деле не проще, чем просто преобразование скрипта в Python 3, но если кто-то еще его поддерживает, он может упростить обновление, так как вам не придется восстанавливать его самостоятельно.Кроме того, вы можете продолжать использовать одну и ту же версию скрипта Python 2 как из программ Python 2, так и из программ Python 3, даже если вы вносите изменения, без усилий по созданию 2/3-совместимого скрипта.Ваш пробег может отличаться.

0 голосов
/ 16 декабря 2018

Если ваша среда python использует python 3.5, при вызове скрипта он будет работать с версией среды python, то есть 3.5.

Если вызываемый вами скрипт не совместим с python 3.5Вы можете столкнуться с ошибками или, что еще хуже, с неожиданными результатами, которые могут быть труднее подловить (см. раздел ниже)

Общим источником несовместимости между питоном 2 и 3 являются, но не ограничиваются ими:

  • использование print "hello" (python 2.7) вместо print("hello") (python 3),
  • использование xrange (python 2.7) вместо range (python3),
  • 9 / 4 с результатом 2 (Python 2,7) против 2,25 (Python 3).

1.Обеспечение бесперебойной работы вашего сценария в python 2 и 3

Если вы хотите, чтобы ваш сценарий python 2.7 был совместим с python 3.5, вы должны убедиться, что он соответствует стандартам python 3, используя такие вещи, как

  • from __future__ import print_function
  • from __future__ import division
  • from six.moves import range

Для получения дополнительной информации о совместной работе кода Python 2 и 3 см.документация Six: библиотека совместимости Python 2 и 3 .

2.Преобразование вашего старого сценария Python 2 в Python 3 (может быть обратно несовместим с Python 2)

Если вы хотите преобразовать сценарий Python 2 в Python 3, вы можете использовать 2to3 , но будьте осторожны .

Давайте возьмем этот простой фрагмент Python 2.7:

# foo.py
for i in xrange(10):
    print i

При вызове 2to3 foo.py -w, foo.py становится:

# foo.py
for i in range(10):
    print(i)

Если ваша цель - использовать foo.py с Python 3 только с этого момента, 2to3 является достойным решением, хотя и не решает всех проблем.Однако, если вы хотите продолжить использовать ваш скрипт с Python 2.7, это может быть проблематично.Например, использование range в Python 2.7 крайне неэффективно по сравнению с xrange.

...