2015-02-08 9 views
3

Я пишу модуль python neuralnet. Он отлично работает в Python2, но в Python3 импорт не работает.Python3 правильный способ импорта относительного или абсолютного?

Это моя структура кода.

neuralnet/ 
    __init__.py 
    train.py   # A wrapper to train (does not define new things) 
    neuralnet.py  # Defines the workhorse class neuralnet 
    layers/ 
     __init__.py 
     inlayer.py  # Defines input layer class 
     hiddenlayer.py 

application/   # A seperate application (not part of the package) 
    classify.py  # Imports the neuralnet class from neuralnet.py 

train.py необходимо импортировать neuralnet.py в neuralnet class.

neuralnet.py необходимо импортировать слои/inlayer.py и т.д.

(я предпочитаю относительно импорта.)

У меня есть другое приложение (classify.py), который необходимо импортировать этот модуль. Где я ...

from neuralnet.neuralnet import neuralnet 

Я попробовал несколько способов импорта. Либо я получаю сообщение об ошибке (в основном аркан, как родитель не импортируется)

1) Во время работы train.py (который является частью модуля neuralnet)

from . import layer # In file neuralnet.py 
SystemError: Parent module '' not loaded, cannot perform relative import 

Или

2) при запуске classify.py (который находится вне модуля).

from layer.inlayers import input_layer # In file neuralnet.py 
ImportError: No module named 'layer' 

В течение многих лет мой импорт работал отлично на Python2. Мне интересно, что Python3 ожидает от меня? Должен ли я перемещать train.py на внешний модуль (технически это не входит в модуль)? Пожалуйста, предложите лучшую практику.

Благодаря Ракеш

+1

Под 'net.py' вы имеете в виду' neuralnet.py'? Ваш пример не включает файл, называемый 'net.py'. Кроме того, если train.py не является частью вашего пакета, то да, вы должны его переместить. – BrenBarn

ответ

1

В Python 3, неявные относительный импорт запрещен, см https://www.python.org/dev/peps/pep-0328/ и https://docs.python.org/release/3.0.1/whatsnew/3.0.html#removed-syntax:

The only acceptable syntax for relative imports is from .[module] import name. All import forms not starting with . are interpreted as absolute imports. (PEP 0328)

from .stuff import Stuff является относительный импорт явно, что вы "должны" сделать использование по возможности, и должно использовать в Python 3, когда это возможно. Перейдите к https://stackoverflow.com/a/12173406/145400 для более глубокого анализа относительного импорта.

+0

Нет, это не работает! 'from .layer.inlayers import InputLayer' throws ' SystemError: Parent module '' не загружен, не может выполнять относительный импорт. –

+1

Вы действительно должны сначала очистить свой вопрос (он все еще относится к net.py). Затем убедитесь, что вы правильно используете '__init __. Py'. Там вы указываете открытый интерфейс пакета. То есть, в 'neuralnet/__ init __. Py' вам лучше импортировать все релевантно относительно и контролировать через' __all__' то, что должно быть открыто снаружи. То же самое с пакетом слоев. Пакет neuralnet должен импортировать из слоев только те объекты, которые вы явно раскрываете в 'layers/__ init __. Py'. –

Смежные вопросы