Как отладить ошибку импорта Python - PullRequest
9 голосов
/ 26 мая 2011

У меня есть структура каталогов:

network/__init__.py
network/model.py
network/transformer/__init__.py
network/transformer/t_model.py

оба __init__.py файла имеют соответствующие

__all__ = [
    "model",  # or "t_model" in the case of transformer
    "view",
    ]

В t_model.py у меня есть

from .. import model

но он говорит:

ImportError: cannot import name model

Если я пытаюсь

from ..model import Node

, он говорит:

ImportError: cannot import name Node

Это очень запутанные ошибки.


Редактировать: даже абсолютный импорт не удается:

import network as N
print(dir(N), N.__all__)
import network.model as M

['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'transformer'] ['model', 'view']
Traceback (most recent call last):..........
AttributeError: 'module' object has no attribute 'model'

Редактировать: Это был циклический импорт .

Ответы [ 2 ]

4 голосов
/ 26 мая 2011

Это работает для меня. Можете ли вы запустить / импортировать model.py? Если у него есть синтаксические ошибки, вы не можете его импортировать. (В общем, я рекомендую , а не для относительного импорта, их использование ограничено).

Ваш абсолютный импорт очень запутан. Способ сделать абсолютный импорт в этом пакете:

from network model import Node

Это отлично работает.

У меня есть файл program.py на верхнем уровне (над сетью):

из сети.трансформатор импорта t_model

И t_model.py выглядит так:

from .. import model
print "Model", model

from ..model import Node
print "Node", Node

from network.model import Node
print "Absolute", Node

И вывод:

Model <module 'network.model' from '/tmp/network/model.pyc'>
Node <class 'network.model.Node'>
Absolute <class 'network.model.Node'>

Так что, как вы видите, он работает нормально, ваша ошибка в другом месте.

0 голосов
/ 26 мая 2011

С этот вопрос .

project/
    program.py           # entry point to the program
    network/         
        __init__.py
        transform/       # .. will target network
            __init__.py

Я думаю, вы также можете запустить network / model.py из каталога ниже и получить относительный импорт в сеть.так что ...

network/
    model.py
    __init__.py

тогда вы запустите программу с $ python network/model.py.Вы можете или не должны нажимать __init__.py вместо этого.У меня была программа для механизма приложений, нацеленная на module/__init__.py, и относительный импорт работал отлично.

...