Во-первых, я знаю, что есть несколько вопросов, связанных с этим, уже заданным здесь (This и This). Я прочитал ряд из них, но я обнаружил, что все еще очень запутался в соответствующем способе выполнить это.Смутно о том, как импортировать из других каталогов/родительских каталогов внутри модуля (python 3)
У меня есть проект, который я работаю, которая строится таким образом:
--LabAnalysisModules
|-- __init__.py
|-- EphysTools
|-- __init__.py
|-- synaptics.py
|-- utilities.py
|-- PrairieAnalysis
|-- pv_import.py
|-- pxml_parse.py
--PVAnalysis
|-- __init__.py
|-- MainWindow.py
|-- DataViewer.py
|-- AnalysisWindows
|-- __init__.py
|-- AnalysisWidget.py
AnalysisWidget наследуется от класса DataViewer в DataViewer. При попытке импортировать DataViewer я столкнулся с двумя путями.
Что является наиболее подходящим способом фактического импорта DataViewer. Я в настоящее время прибегаю к включению
sys.path.append(os.path.abspath("../../PVAnalysis"))
в AnalysisWidget, так как относительный импорт дает мнеSystemError: Parent module '' not loaded, cannot perform relative import
В пределах DataViewer я это попробовать ... кроме блока (на некоторых из моих машин LabAnalysisModules было постоянно добавляются к пути питона, и на других он не имеет)
try: import PrairieAnalysis.pv_import as pvi import EphysTools.utilities as util except ImportError: import os sys.path.append(os.path.abspath('../LabAnalysisModules')) import PrairieAnalysis.pv_import as pvi import EphysTools.utilities as util
Запуск сам DataViewer работает отлично, но я бегу в другую ошибку импорта import DataViewer
из AnalysisWidget
:
ImportError: No module named 'PrairieAnalysis'
Добавление print(sys.path)
к вышесказанному except
блока, это то, что добавляется к sys.path, когда DataViewer импортируется:
E:\\Users\\Dan\\SkyDrive\\Documents\\Python\\PVAnalysis\\LabAnalysisModules'
Что явно не правильно.
я могу исправить эту ошибку импорта, в том числе sys.path.append('../../LabAnalysisModules')
в AnalysisWidget
, но это кажется очень запутано затруднительного
Edit 1
Как я уже говорил в комментариях, в конечном счете AnalysisWidget будет импортирован MainWindow , Опять же, действительно не ясно, как работает относительный импорт. Получение:
from .. import DataViewer
ValueError: attempted relative import beyond top-level package
В конце концов, эти две вещи, которые я пытаюсь сделать это:
Уметь просто запустить AnalysisWidget.py (я знаю, что в целом вы Арен «Предполагается, что вы запускаете скрипты из модуля, но когда дело доходит до создания графического интерфейса, я все время это делаю)
Уметь импортировать AnalysisWidget в MainWindow.
Если я очищаю, как я делаю импорт для LabAnalysisModules, это хорошо.
Как вы вызываете 'AnalysisWidget'? Непосредственно или с помощью переключателя '-m' на Python? – Kevin
Сообщение SystemError, о котором говорилось выше, просто пытается импортировать AnalysisWidget внутри оболочки python. Я попытался использовать ключ -m, но, похоже, я не делаю что-то должным образом, поскольку я просто получаю сообщение об ошибке при поиске спецификации для ... и т. Д. – user3014097
Ultimate, хотя AnalysisWidget будет импортирован MainWindow. – user3014097