#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)
Смотрите эту шпаргалку для получения более подробной информации.