Python: Как импортировать модуль 2.7 в программу 3.4?

#python #python-2.7 #python-3.x #import

#python #python-2.7 #python-3.x #импорт

Вопрос:

Вопрос:

Возможно ли импортировать модуль, который я написал на python 2.7, в программу 3.4, которую я написал?

Предыстория:

Я пытался это сделать, и, как и ожидалось, он выдает SyntaxError: Invalid Syntax , как только он видит первое print "string literal" утверждение вместо 3.4 print() . Есть несколько дополнительных несовместимых фрагментов кода, например, import Tkinter вместо tkinter . Модуль 2.7 должен оставаться в 2.7, потому что одна из его зависимостей, похоже, не работает в 3.X (привязка python для switchvox api).

Я создаю приложение для отображения, которое будет вызывать любой модуль, указанный в его файле конфигурации, и отображать выходные данные этого модуля (строку или, в будущем, возможно, dict) в виджете tkinter. Все, что нужно сделать моей программе, это импортировать модуль 2.7 и вызывать одну функцию один раз (каждые x секунд), чтобы получить эту строку данных.

Комментарии:

1. Если одна из зависимостей не выполняется в Python 3, то нет смысла пытаться портировать ваш модуль.

2. @MartijnPieters Вы имеете в виду зависимости исходной вызывающей программы 3.4 или зависимости вызываемой программы 2.7, или либо?

3. Модуль 2.7 не является программой . Это код Python, который может запускать только интерпретатор Python 2.7. Его импорт означает, что он должен иметь возможность работать на Python 3.4 тоже . Это, безусловно, возможно , особенно с вспомогательным модулем , но если модуль 2.7 имеет зависимости, которые не выполняются в 3, тогда все ставки отменяются.

4. Есть ли какая-либо причина, по которой ваша программа должна работать на Python 3.4? Почему бы просто не запустить его в 2.7?

5. @ColinAtkinson Ты прав, я взвешивал этот вариант. Изначально мы просто подумали, что было бы лучше начать с 3.4, потому что он был новее и мог бы лучше поддерживаться в будущем

Ответ №1:

Вы можете сделать свой код python 2.7 совместимым с 3.4 — таким образом, вы можете импортировать его из 3.4 и использовать те же классы и функции.

Для запуска вы должны запустить его в другом процессе, используя python 2.7 — используя подпроцесс. Предположим main27.py имеет следующую строку:

 print 1
  

Чтобы запустить его с помощью подпроцесса, вы делаете следующее:

 import subprocess
cmd = [r'c:python27python.exe', 'main27.py']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
  

Чем в стандартном выводе, у вас есть следующий вывод:

 1
  

Для более сложного обмена данными вы можете использовать json или pickle с использованием файлов.

Комментарии:

1. Спасибо за ответ, Хагай. Можете ли вы объяснить, как можно было бы запустить «другой процесс» или «подпроцесс»?

Ответ №2:

Действительно, можно сделать ваш код совместимым с обеими версиями. Очевидным и потенциально более раздражающим является оператор печати.

Допустим, у вас есть следующий код Python 2.x:

 name = "beautiful"
print "Hallo"
print "I mean, hallo ", name
  

Первая строка отлично работает в обеих версиях. Вторая строка может просто стать:

 print("Hallo")
  

Который также совместим с обеими версиями. Обратите внимание, что вы можете использовать одинарные или двойные кавычки.

В последней строке требуется небольшая хитрость, в противном случае Python 2 также напечатает скобки. Чтобы заставить его работать так же в Python 2, как и в Python 3, вы должны импортировать функцию print_function из future в верхней части вашего модуля.

В общем, это двойной совместимый код:

 #Works in Python 2.x or Python 3.x
from __future__ import print_function

print("Hallo")
print("I mean, hallo ", name)
  

Смотрите эту шпаргалку для получения более подробной информации.