У меня есть два модуля Python:
a.py
import b
def hello():
print "hello"
print "a.py"
print hello()
print b.hi()
b.py
import a
def hi():
print "hi"
Когда я бегу a.py
, я получаю:
AttributeError: 'module' object has no attribute 'hi'
Что означает ошибка? Как мне это исправить?
python
attributeerror
Стивен Хсу
источник
источник
Ответы:
У вас есть взаимный импорт верхнего уровня, что почти всегда является плохой идеей.
Если вам действительно нужен взаимный импорт в Python, способ сделать это - импортировать их в функцию:
Теперь a.py можно смело обходиться
import b
без проблем.(На первый взгляд может показаться, что
cause_a_to_do_something()
это будет крайне неэффективно, потому что это происходитimport
каждый раз, когда вы вызываете его, но на самом деле работа по импорту выполняется только в первый раз. Второй и последующий раз, когда вы импортируете модуль, это быстрая операция. )источник
Я также видел эту ошибку, когда случайно именовал модуль с тем же именем, что и один из стандартных модулей Python. Например, у меня был модуль,
commands
который также называется модулем библиотеки Python. Это оказалось трудно отследить, так как он работал правильно в моей локальной среде разработки, но не с указанной ошибкой при запуске в Google App Engine.источник
Проблема заключается в круговой зависимости между модулями.
a
импортb
иb
импортa
. Но один из них должен быть загружен первым - в этом случае python заканчивает инициализацию модуляa
раньшеb
иb.hi()
еще не существует, когда вы пытаетесь получить к нему доступa
.источник
Я получил эту ошибку, ссылаясь на enum, который был импортирован неправильно, например:
Правильный импорт:
Надеюсь, что это помогает кому-то
источник
Я столкнулся с этой ошибкой, потому что модуль фактически не был импортирован. Код выглядел так:
Последняя строка привела к
AttributeError
. Причина была в том, что я не заметил, что подмодулиa
(a.b
иa.c
) были импортированы явно , и предположил, чтоimport
оператор действительно импортированa
.источник
Я столкнулся с той же проблемой. исправлено с помощью
reload
.источник
Я столкнулся с этой проблемой, когда извлек более старую версию репозитория из git. Git заменил мои
.py
файлы, но оставил неотслеживаемые.pyc
файлы. Поскольку.py
файлы и.pyc
файлы были не синхронизированы,import
команда в.py
файле не смогла найти соответствующий модуль в.pyc
файлах.Решение состояло в том, чтобы просто удалить
.pyc
файлы и позволить им автоматически восстанавливаться.источник
.pyc
файлов:find . -name "*.pyc" -exec rm -f {} \;
в Ubuntu 18.04 ( virtualenv , python.3.6.x ) следующий фрагмент перезагрузки решил эту проблему для меня:
main.py
где:
для дополнительной проверки документации : здесь
источник
Все вышеприведенные ответы великолепны, но я бы хотел здесь побеседовать. Если вы не обнаружили проблем, упомянутых выше, попробуйте очистить вашу рабочую среду. Это сработало для меня.
источник
Не уверен, как, но приведенные ниже изменения отсортировали мою проблему:
у меня было имя файла и имя импорта, например, у меня было имя файла как emoji.py, и я пытался импортировать эмодзи. Но изменение имени файла решило проблему.
Надеюсь, это поможет
источник
Круговой импорт вызывает проблемы, но в Python есть способы его уменьшения.
Проблема в том, что при запуске
python a.py
он запускается,a.py
но не помечает его как импортированный как модуль. Так что в свою очередьa.py
-> модуль импорта b -> модуль импорта a -> модуль импорта b. Последний импортирует no-op, так как b в настоящее время импортируется, и Python защищает от этого. И b пока пустой модуль. Поэтому, когда он выполняетb.hi()
, он не может ничего найти.Обратите внимание, что то,
b.hi()
что было выполнено, находится во времяa.py
-> модуля b -> модуля a, а неa.py
непосредственно.В вашем конкретном примере вы можете просто запустить
python -c 'import a'
на верхнем уровне, поэтому первое выполнениеa.py
регистрируется как импорт модуля.источник
заказ импортирующей была причина , почему у меня были проблемы:
a.py
:b.py
:Просто еще один пример того, как это может выглядеть, похоже на ответ Ричи Хинди, но с классами.
источник
Я много раз сталкивался с этой проблемой, но я не пытался копать глубже. Теперь я понимаю главный вопрос.
На этот раз моей проблемой был импорт сериализаторов (django и restframework) из разных модулей, таких как следующие:
У меня была такая проблема:
То, что я хотел сделать, было следующее:
Итак, как указано выше, как решить эту проблему (импорт верхнего уровня), я перейду к следующим изменениям:
Таким образом, django runserver был выполнен без проблем:
Конечное состояние строк кода было следующим:
Надеюсь, что это может быть полезно для всех остальных.
Приветствую,
источник
В моем случае работа с Python 2.7 с версией numpy 1.15.0, она работала с
источник