Почему не работает импорт Python? - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть три модуля:

plugin_grt.py

fragments.py

helpers.py

Прямо в верхней части plugin_grt.py Iесть

from jpa_export_helpers import SourceFile, Mysql, Conv, Columns, Column, Table, ForeignKey, Index, Catalog, Inheritance

, который работает, то есть я могу использовать Table.whwhatMethod (...) без проблем.Теперь, когда я добавляю тот же импорт в начало модуля fragments.py, я получаю:

Traceback (most recent call last):

  File "C:\Users\Kawu\AppData\Roaming\MySQL\Workbench\modules\jpa_export_plugin_grt.py", line 53, in <module>
    from jpa_export_helpers import SourceFile, Mysql, Conv, Columns, Column, Table, ForeignKey, Index, Catalog, Inheritance

  File "C:\Users\Kawu\AppData\Roaming\MySQL\Workbench\modules\jpa_export_helpers.py", line 2, in <module>
    from jpa_export_fragments import Type, EnumValue

  File "C:\Users\Kawu\AppData\Roaming\MySQL\Workbench\modules\jpa_export_fragments.py", line 2, in <module>
    from jpa_export_helpers import SourceFile, Mysql, Conv, Columns, Column, Table, ForeignKey, Index, Catalog, Inheritance

ImportError: cannot import name SourceFile

Почему это не работает?Единственный обходной путь - импортировать классы туда, где они нужны, но мне это не нравится (по крайней мере, на данный момент):

def getPrimaryKeyColumns(self):
    from jpa_export_helpers import Columns
    return Columns.getPrimaryKeyColumns(self.table.columns)

Обратите внимание, я изначально парень из Java, поэтому импортирую "вбудет "странным для меня.В любом случае, в чем здесь проблема?

Ответы [ 2 ]

3 голосов
/ 16 апреля 2011

При импорте в модуль вы импортируете в пространство имен модуля. Таким образом, когда у вас есть

 from jpa_export_helpers import SourceFile

в plugin_jrt_py вы действительно создали имя plugin_jrt_py.SourceFile. После разрешения пространства имен, в пределах plug_in_jrt.py это имя может быть сокращено до SourceFile, но только в пределах plug_in_jrt.

Поскольку импорт имеет побочные эффекты, оператор import старается не импортировать модуль дважды.

Вы не указываете вызывающую последовательность, но я подозреваю, что fragments.py импортируется plugin_jrt.py, поэтому имя недоступно без уточнения.

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

2 голосов
/ 16 апреля 2011

Обратите внимание, что в трассировке стека нет ошибок, связанных с чем-либо, кроме импорта. Я обнаружил, что такая ошибка почти всегда связана с рекурсивным циклическим импортом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...