Saya memiliki dua modul 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"
Ketika saya berlari a.py
, saya mendapatkan:
AttributeError: 'module' object has no attribute 'hi'
Apa artinya kesalahan itu? Bagaimana saya memperbaikinya?
python
attributeerror
Stephen Hsu
sumber
sumber
Jawaban:
Anda memiliki impor tingkat atas bersama, yang hampir selalu merupakan ide yang buruk.
Jika Anda benar-benar harus saling mengimpor dengan Python, cara untuk melakukannya adalah dengan mengimpornya dalam suatu fungsi:
Sekarang a.py dapat melakukannya dengan aman
import b
tanpa menimbulkan masalah.(Sepintas mungkin tampak
cause_a_to_do_something()
sangat tidak efisien karena melakukanimport
setiap kali Anda menyebutnya, tetapi pada kenyataannya pekerjaan impor hanya dilakukan pertama kali. Kali kedua dan selanjutnya Anda mengimpor modul, ini adalah operasi yang cepat. )sumber
Saya juga melihat kesalahan ini ketika secara tidak sengaja memberi nama modul dengan nama yang sama dengan salah satu modul Python standar. Misalnya saya punya modul yang disebut
commands
yang juga merupakan modul perpustakaan Python. Ini terbukti sulit dilacak karena berfungsi dengan benar di lingkungan pengembangan lokal saya tetapi gagal dengan kesalahan yang ditentukan saat berjalan di Google App Engine.sumber
Masalahnya adalah ketergantungan melingkar antara modul.
a
imporb
danb
impora
. Tetapi salah satu dari mereka perlu dimuat terlebih dahulu - dalam hal ini python akhirnya menginisialisasi modula
sebelumnyab
danb.hi()
belum ada ketika Anda mencoba mengaksesnyaa
.sumber
Saya mendapatkan kesalahan ini dengan mereferensikan enum yang diimpor dengan cara yang salah, misalnya:
Impor yang benar:
Semoga itu bisa membantu seseorang
sumber
Saya mengalami kesalahan ini karena modul tidak benar-benar diimpor. Kode tersebut terlihat seperti ini:
Baris terakhir menghasilkan
AttributeError
. Penyebabnya adalah saya gagal memperhatikan bahwa submodula
(a.b
dana.c
) diimpor secara eksplisit , dan mengasumsikan bahwaimport
pernyataan tersebut benar-benar diimpora
.sumber
Saya menghadapi masalah yang sama. diperbaiki dengan menggunakan
reload
.sumber
Saya mengalami masalah ini ketika saya memeriksa versi lama dari repositori dari git. Git mengganti
.py
file saya , tetapi meninggalkan.pyc
file yang tidak terlacak . Karena.py
file dan.pyc
file tidak sinkron,import
perintah dalam.py
file tidak dapat menemukan modul yang sesuai dalam.pyc
file.Solusinya adalah dengan menghapus
.pyc
file, dan membiarkannya dibuat ulang secara otomatis.sumber
.pyc
file:find . -name "*.pyc" -exec rm -f {} \;
di ubuntu 18.04 ( virtualenv , python.3.6.x ), cuplikan reload berikut memecahkan masalah untuk saya:
main.py
dimana:
untuk dokumentasi lebih lanjut, periksa di sini
sumber
Semua jawaban di atas bagus, tetapi saya ingin berpadu di sini. Jika Anda tidak menemukan masalah yang disebutkan di atas, coba bersihkan lingkungan kerja Anda. Ini berhasil untuk saya.
sumber
Tidak yakin bagaimana tetapi perubahan di bawah ini mengurutkan masalah saya:
saya mempunyai nama file dan impor nama yang sama untuk misalnya saya punya nama file sebagai emoji.py dan saya mencoba mengimpor emoji. Tetapi mengubah nama file memecahkan masalah.
Semoga ini bisa membantu
sumber
Impor sirkular menyebabkan masalah, tetapi Python memiliki cara untuk memitigasi bawaannya.
Masalahnya adalah ketika Anda menjalankan
python a.py
, itu berjalana.py
tetapi tidak menandainya diimpor sebagai modul. Jadi pada gilirannyaa.py
-> modul impor b -> modul impor a -> modul impor b. Impor terakhir no-op karena b saat ini sedang diimpor dan Python menjaga itu. Dan b adalah modul kosong untuk saat ini. Jadi saat dijalankanb.hi()
, ia tidak dapat menemukan apa pun.Perhatikan bahwa
b.hi()
yang dieksekusi adalah selamaa.py
-> modul b -> modul a, tidaka.py
secara langsung.Dalam contoh spesifik Anda, Anda bisa menjalankannya
python -c 'import a'
di tingkat atas, sehingga eksekusi pertamaa.py
terdaftar sebagai pengimporan modul.sumber
The rangka dari impor adalah alasan mengapa saya mengalami masalah:
a.py
:b.py
:Contoh lain tentang tampilannya, mirip dengan jawaban RichieHindie, tetapi dengan kelas.
sumber
Saya telah banyak kali berselisih dengan masalah ini, tetapi saya tidak mencoba menggali lebih dalam tentang hal ini. Sekarang saya mengerti masalah utama.
Kali ini masalah saya mengimpor Serializers (Django dan Restframework) dari modul yang berbeda seperti berikut:
Saya mendapatkan masalah seperti ini:
Apa yang ingin saya capai adalah sebagai berikut:
Jadi, seperti yang disebutkan oleh baris di atas cara menyelesaikannya (impor tingkat atas), saya melanjutkan untuk melakukan perubahan berikut:
Karena itu, django runserver dijalankan tanpa masalah:
Keadaan akhir dari baris kode adalah sebagai berikut:
Semoga ini bisa bermanfaat bagi orang lain.
Salam pembuka,
sumber
Dalam kasus saya bekerja dengan python 2.7 dengan numpy versi 1.15.0, itu berhasil
sumber