2015-01-29 6 views
1

Во-первых, я знаю, что есть несколько вопросов, связанных с этим, уже заданным здесь (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 я столкнулся с двумя путями.

  1. Что является наиболее подходящим способом фактического импорта DataViewer. Я в настоящее время прибегаю к включению sys.path.append(os.path.abspath("../../PVAnalysis")) в AnalysisWidget, так как относительный импорт дает мне SystemError: Parent module '' not loaded, cannot perform relative import

  2. В пределах 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 

В конце концов, эти две вещи, которые я пытаюсь сделать это:

  1. Уметь просто запустить AnalysisWidget.py (я знаю, что в целом вы Арен «Предполагается, что вы запускаете скрипты из модуля, но когда дело доходит до создания графического интерфейса, я все время это делаю)

  2. Уметь импортировать AnalysisWidget в MainWindow.

Если я очищаю, как я делаю импорт для LabAnalysisModules, это хорошо.

+0

Как вы вызываете 'AnalysisWidget'? Непосредственно или с помощью переключателя '-m' на Python? – Kevin

+0

Сообщение SystemError, о котором говорилось выше, просто пытается импортировать AnalysisWidget внутри оболочки python. Я попытался использовать ключ -m, но, похоже, я не делаю что-то должным образом, поскольку я просто получаю сообщение об ошибке при поиске спецификации для ... и т. Д. – user3014097

+0

Ultimate, хотя AnalysisWidget будет импортирован MainWindow. – user3014097

ответ

1

Для того, чтобы импорт пакетов для корректной работы в Python 3, рабочий каталог должен быть родителем LabAnalysisModules и PVAnalysis (или указанный каталог должен появиться на sys.path, но делает его рабочий каталог является самым простым способом сделать это) , Кроме того, если какой-либо из ваших модулей являются выполняемыми, они должны вызываться с синтаксисом, как это:

python -m 'PVAnalysis.AnalysisWindows.AnalysisWidget' 

Пожалуйста, обратитесь к PEP 328 для получения дополнительной информации.

+0

Чтение через PEP 328 Я до сих пор не понимаю, почему, изнутри AnalysisWidget.py, 'from ..DataViewer import DataViewer' не работает. Это связано с вызовом 'import AnalysisWindows.AnalysisWidget' из MainWindow.py. Для меня это похоже на пример 'from ..moduleA import foo' в PEP – user3014097

+0

Это потому, что вы пересекаете границы верхнего уровня пакета. Если вы хотите импортировать что-то из отдельного пакета верхнего уровня, вам необходимо использовать абсолютный импорт. – Kevin

+0

Прошу прощения, я до сих пор не понимаю, что вы имеете в виду. Как структура файла/пакета, представленная выше, чем та, что я делаю, недействительна (спасибо за то, что она со мной связана) – user3014097