Почему я сталкиваюсь с ошибкой ImportError, когда пытаюсь «повторно импортировать» модуль? - PullRequest
1 голос
/ 13 июля 2010

У меня написана серия модулей python, которые находятся в одном каталоге, и у меня возникла проблема с ImportError.

Я использую три модуля: draw_menu.py, errors.py и file_operations.py.

В errors.py мне требуется список кодов ошибок, я использую пользовательский метод, определенный в file_operations.py, чтобы открыть файл, содержащий коды, поэтому я использую import file_operations чуть ниже she-bang (над классом определение).

В file_operations.py Я использую метод, определенный в error.py, для печати сообщений об ошибках при ошибках (например, файл не найден и т. Д.). Я поэтому import errors таким же образом здесь.

Вышеописанное работает нормально, но когда я использую draw_menu.py, который использует файл для определения параметров в меню ascii (поэтому я использую import file_operations), возникает ошибка ImportError.

ImportError: cannot import name file_operations

Я понимаю, что это потому, что "дерево импорта", если хотите, выглядит следующим образом:

draw_menu <- <code>file_operations <- <code>errors <- <code>file_operations

Важно, чтобы каждый модуль мог использоваться индивидуально, почему это проблема и как я могу ее преодолеть, не удаляя import file_operations из errors.py?

Спасибо

Tom

Ответы [ 3 ]

2 голосов
/ 13 июля 2010

Круговой импорт может вызвать проблемы в Python (как и следовало ожидать).Возможно, стоит проверить, если:

A) errors.py и file_operation.py должны быть одним модулем (если они оба так сильно зависят друг от друга, должны ли они быть отдельными?)

Б) Вы можете задержать import в одном или другом модуле.Оператор импорта в функции не будет выполняться до тех пор, пока функция не будет вызвана, и, хотя обычно рекомендуется импортировать в начале модуля, в Python требования к нему отсутствуют.В подобных ситуациях можно избежать циклической ссылки во время импорта.

1 голос
/ 13 июля 2010

Проблема не в самом импорте, а в зависимостях .file_operations не может быть обработано, пока не импортировано errors, но errors не может быть обработано, пока не импортировано file_operations.Python распознает это как невозможную ситуацию и выдает ошибку.

Лучшее решение для этого - рефакторинг ваших файлов, чтобы у вас больше не было этой циклической зависимости.Если это действительно невозможно, альтернативное решение состоит в том, чтобы изменить один из модулей так, чтобы неправильный импорт происходил внутри нужной функции, а не на верхнем уровне.Это означает, что первоначальная обработка модуля не зависит от импорта, поэтому он будет успешным.

0 голосов
/ 13 июля 2010

Помимо нарушения круговой зависимости, вы можете попытаться переместить места ваших импортных вызовов. Не забывайте, что импорт в Python - это просто регулярные операторы, поэтому вы можете импортировать, например, внутри функций.

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

Вы можете обнаружить, что можете облегчить проблему, импортировав ошибки / file_operations только в тот момент, когда вам действительно нужно их использовать. Это может быть внутри функции. Так что, возможно, обернуть вызов функции в ошибки:


def print_error_message(err):
    from errors import print_error_message as _print_error_message
    _print_error_message(err)

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

...