2013-09-16 3 views
-2

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

import ui.interface.interface 
obj = ui.interface.interface.InterfaceCodes() 

У меня есть тот же самый код в другой упаковке и прекрасно работают. но я получаю следующее отслеживающий:

Traceback (most recent call last): 
    File "./main.py", line 31, in <module> 
    from materials.materials import * 
    File "/home/mohsen/codes/amlak/amlak/src/materials/materials.py", line 
40, in <module> 
    from ui.interface.interface import * 
    File "/home/mohsen/codes/amlak/amlak/src/ui/interface/interface.py", 
line 32, in <module> 
    from ui.materialsFrame import * 
    File "/home/mohsen/codes/amlak/amlak/src/ui/materialsFrame.py", line 
24, in <module> 
    from ui.materialsFindFrame import * 
    File "/home/mohsen/codes/amlak/amlak/src/ui/materialsFindFrame.py", 
line 14, in <module> 
    from common.objects.objects import * 
    File "/home/mohsen/codes/amlak/amlak/src/common/objects/objects.py", 
line 28, in <module> 
    obj = ui.interface.interface.InterfaceCodes() 
AttributeError: 'module' object has no attribute 'interface' 

Когда я изменил мой код:

from ui.interface.interface import * 
obj = ui.interface.interface.InterfaceCodes() 

я получаю:

Traceback (most recent call last): 
    File "./main.py", line 31, in <module> 
    from materials.materials import * 
    File "/home/mohsen/codes/amlak/amlak/src/materials/materials.py", line 
40, in <module> 
    from ui.interface.interface import * 
    File "/home/mohsen/codes/amlak/amlak/src/ui/interface/interface.py", 
line 32, in <module> 
    from ui.materialsFrame import * 
    File "/home/mohsen/codes/amlak/amlak/src/ui/materialsFrame.py", line 
24, in <module> 
    from ui.materialsFindFrame import * 
    File "/home/mohsen/codes/amlak/amlak/src/ui/materialsFindFrame.py", 
line 14, in <module> 
    from common.objects.objects import * 
    File "/home/mohsen/codes/amlak/amlak/src/common/objects/objects.py", 
line 28, in <module> 
    Obj = ui.interface.interface.InterfaceCodes() 
NameError: name 'ui' is not defined 

Кроме того, если я удалить «ui.interface.interface «я получаю:

Traceback (most recent call last): 
    File "./main.py", line 31, in <module> 
    from materials.materials import * 
    File "/home/mohsen/codes/amlak/amlak/src/materials/materials.py", line 
40, in <module> 
    from ui.interface.interface import * 
    File "/home/mohsen/codes/amlak/amlak/src/ui/interface/interface.py", 
line 32, in <module> 
    from ui.materialsFrame import * 
    File "/home/mohsen/codes/amlak/amlak/src/ui/materialsFrame.py", line 
24, in <module> 
    from ui.materialsFindFrame import * 
    File "/home/mohsen/codes/amlak/amlak/src/ui/materialsFindFrame.py", 
line 14, in <module> 
    from common.objects.objects import * 
    File "/home/mohsen/codes/amlak/amlak/src/common/objects/objects.py", 
line 28, in <module> 
    Obj = InterfaceCodes() 
NameError: name 'InterfaceCodes' is not defined 

Мой вопрос есть, действительно я не знаю, как это сделать ...!

ответ

1

У вас, кажется, есть проблема с круговой проблемой. По внешнему виду вашей первой трассировки стеки,

  • ui.interface.interface импорта ui.materialsFrame,
  • ui.materialsFrame импорта ui.materialsFindFrame,
  • ui.materialsFindFrame импорта common.objects.objects,
  • common.objects.objects импорта ui.interface.interface,

... который уже находится в процессе импорта. С ui.interface.interface попытался импортировать ui.materialsFrame прямо в начале, на момент последнего импорта он еще не имеет InterfaceCodes в своих переменных, поэтому вы получаете AttributeError.

Попробуйте переделать свою библиотеку, чтобы избавиться от этого цикла или, по крайней мере, попытаться не называть функции/конструкторы во время импорта.

+0

Я думаю, что 'python' решил эту проблему, и только' C/C++ 'имеет эту проблему в' include files'. Спасибо! – PersianGulf

+0

У вас есть другое решение без изменения арки? – PersianGulf

+0

Как я уже говорил в последней фразе, если вы только определяете классы и функции на корневом уровне, циклический импорт не является проблемой, потому что имена внутри функций/методов будут разрешены во время выполнения, а не во время импорта. Вы не можете получить больше, чем на любом языке. – fjarri

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