Mam dwa moduły 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"
Kiedy biegnę a.py
, dostaję:
AttributeError: 'module' object has no attribute 'hi'
Co oznacza błąd? Jak to naprawić?
python
attributeerror
Stephen Hsu
źródło
źródło
Odpowiedzi:
Masz wzajemny import najwyższego poziomu, co prawie zawsze jest złym pomysłem.
Jeśli naprawdę potrzebujesz wzajemnych importów w Pythonie, sposobem na to jest zaimportowanie ich w ramach funkcji:
Teraz a.py może bezpiecznie obejść się
import b
bez powodowania problemów.(Na pierwszy rzut oka może się wydawać, że
cause_a_to_do_something()
byłoby to bardzo nieefektywne, ponieważ robi się to zaimport
każdym razem, gdy go wywołujesz, ale w rzeczywistości importowanie odbywa się tylko za pierwszym razem. Za drugim i następnym razem, gdy importujesz moduł, jest to szybka operacja. )źródło
Widziałem także ten błąd, gdy nieumyślnie nadano nazwę modułowi o tej samej nazwie, co jeden ze standardowych modułów Pythona. Np. Miałem moduł o nazwie,
commands
który jest również modułem biblioteki Pythona. To okazało się trudne do wyśledzenia, ponieważ działało poprawnie w moim lokalnym środowisku programistycznym, ale nie powiodło się z określonym błędem podczas uruchamiania w Google App Engine.źródło
Problem polega na okrągłej zależności między modułami.
a
importb
ib
importa
. Ale jeden z nich musi zostać załadowany jako pierwszy - w tym przypadku python kończy inicjalizację modułua
wcześniejb
ib.hi()
nie istnieje jeszcze, gdy próbujesz uzyskać do niego dostępa
.źródło
Wystąpił ten błąd, odwołując się do wyliczenia, które zostało zaimportowane w niewłaściwy sposób, np .:
Prawidłowy import:
Mam nadzieję, że komuś pomoże
źródło
Wystąpił ten błąd, ponieważ moduł nie został faktycznie zaimportowany. Kod wyglądał następująco:
Ostatnia linia zakończyła się
AttributeError
. Przyczyną było to, że nie zauważyłem, że podmodułya
(a.b
ia.c
) zostały wyraźnie zaimportowane, i założyłem, żeimport
instrukcja faktycznie zaimportowanaa
.źródło
Napotkałem ten sam problem. naprawione za pomocą
reload
.źródło
Natrafiłem na ten problem, gdy sprawdziłem starszą wersję repozytorium od git. Git zastąpił moje
.py
pliki, ale zostawił nieśledzone.pyc
pliki. Ponieważ.py
pliki i.pyc
pliki nie były zsynchronizowane,import
polecenie w.py
pliku nie mogło znaleźć odpowiedniego modułu w.pyc
plikach.Rozwiązaniem było po prostu usunięcie
.pyc
plików i automatyczne ich ponowne wygenerowanie.źródło
.pyc
pliki:find . -name "*.pyc" -exec rm -f {} \;
w Ubuntu 18.04 ( virtualenv , python.3.6.x ) następujący fragment przeładowania rozwiązał problem:
main.py
gdzie:
więcej dokumentacji sprawdź: tutaj
źródło
Wszystkie powyższe odpowiedzi są świetne, ale chciałbym tu zagrać. Jeśli nie zauważyłeś żadnego z wyżej wymienionych problemów, spróbuj wyczyścić swoje środowisko pracy. To zadziałało dla mnie.
źródło
Nie jestem pewien, w jaki sposób, ale poniższe zmiany posortowały mój problem:
Miałem taką samą nazwę pliku i nazwę importu, np. miałem nazwę pliku jako emoji.py i próbowałem zaimportować emoji. Ale zmiana nazwy pliku rozwiązała problem.
Mam nadzieję, że to pomaga
źródło
Importowanie cykliczne powoduje problemy, ale Python ma sposoby na złagodzenie tego problemu.
Problem polega na tym
python a.py
, że po uruchomieniu działa,a.py
ale nie oznacza, że został zaimportowany jako moduł. Z koleia.py
-> moduł importu b -> moduł importu a -> moduł importu b. Ostatni import, w którym nie ma operacji, ponieważ b jest obecnie importowany i Python chroni przed tym. A b jest na razie pustym modułem. Kiedy więc się uruchomib.hi()
, nic nie znajdzie.Zauważ,
b.hi()
że wykonano to podczasa.py
-> modułu b -> modułu a, a niea.py
bezpośrednio.W twoim przykładzie możesz po prostu uruchomić
python -c 'import a'
na najwyższym poziomie, więc pierwsze wykonaniea.py
jest rejestrowane jako import modułu.źródło
Zamówienie importującej było powodem miałem problemy:
a.py
:b.py
:Kolejny przykład tego, jak może to wyglądać, podobnie do odpowiedzi RichieHindie, ale z klasami.
źródło
Wiele razy podchodziłem do tego problemu, ale nie próbowałem go głębiej badać. Teraz rozumiem główny problem.
Tym razem moim problemem był import Serializatorów (django i restframework) z różnych modułów, takich jak:
Miałem taki problem:
To, co chciałem osiągnąć, było następujące:
Tak więc, jak wspomniano w wierszach powyżej, jak to rozwiązać (import najwyższego poziomu), przystępuję do następujących zmian:
Dlatego django runserver został uruchomiony bez problemów:
Ostateczny stan linii kodu był następujący:
Mam nadzieję, że to może być pomocne dla wszystkich innych.
Pozdrowienia,
źródło
W moim przypadku działał z Pythonem 2.7 z wersją numpy 1.15.0
źródło