Saya memiliki empat file berbeda bernama: utama, vektor, entitas dan fisika. Saya tidak akan memposting semua kode, hanya impor, karena saya pikir di situlah kesalahannya. (Jika Anda mau, saya dapat memposting lebih banyak)
Utama:
import time
from entity import Ent
from vector import Vect
#the rest just creates an entity and prints the result of movement
Kesatuan:
from vector import Vect
from physics import Physics
class Ent:
#holds vector information and id
def tick(self, dt):
#this is where physics changes the velocity and position vectors
Vektor:
from math import *
class Vect:
#holds i, j, k, and does vector math
Fisika:
from entity import Ent
class Physics:
#physics class gets an entity and does physics calculations on it.
Saya kemudian lari dari main.py dan saya mendapatkan kesalahan berikut:
Traceback (most recent call last): File "main.py", line 2, in <module> from entity import Ent File ".../entity.py", line 5, in <module> from physics import Physics File ".../physics.py", line 2, in <module> from entity import Ent ImportError: cannot import name Ent
Saya sangat baru dengan Python tetapi telah bekerja dengan C ++ untuk waktu yang lama. Saya menduga bahwa kesalahan adalah karena mengimpor entitas dua kali, sekali di utama, dan kemudian dalam fisika, tapi saya tidak tahu solusinya. Adakah yang bisa membantu?
from <module> import <name>
, ataufrom <modlue> import *
. Lebih baik mengimpor di bawah namespace modul untuk mencegah kemungkinan menimpa referensi yang diidentifikasi secara identik.Entity
danVector
bukannyaEnt
danVect
, tidak ada alasan untuk mempersingkat nama tersebut. Dan ya, gunakanimport vector
lalux = vector.Vector(0,0,0)
.Jawaban:
Anda memiliki impor yang bergantung pada edaran.
physics.py
diimpor darientity
sebelum kelasEnt
didefinisikan danphysics
mencoba untuk mengimporentity
yang sudah diinisialisasi. Hapus ketergantungan kephysics
darientity
modul.sumber
Entity
danPhysics
terhubung satu sama lain? Saya yakin ada solusi untuk apa yang Anda coba lakukan.Meskipun Anda harus menghindari ketergantungan melingkar, Anda dapat menunda impor dengan python.
sebagai contoh:
ini (setidaknya dalam beberapa kasus) akan menghindari kesalahan.
sumber
Ini adalah ketergantungan sirkuler. Ini dapat diselesaikan tanpa modifikasi struktural pada kode. Masalahnya terjadi karena
vector
permintaan Anda yangentity
tersedia untuk digunakan segera, dan sebaliknya. Alasan untuk masalah ini adalah Anda meminta untuk mengakses konten modul sebelum siap - dengan menggunakanfrom x import y
. Ini pada dasarnya sama denganPython mampu mendeteksi dependensi melingkar dan mencegah impor tak terbatas. Pada dasarnya semua yang terjadi adalah bahwa placeholder kosong dibuat untuk modul (mis. Tidak memiliki konten). Setelah modul dependen melingkar dikompilasi, ia memperbarui modul yang diimpor. Ini bekerja seperti ini.
Agar python dapat bekerja dengan dependensi melingkar, Anda harus menggunakan
import x
gaya saja.Karena Anda tidak lagi merujuk pada isi modul di tingkat atas, python dapat mengkompilasi modul tanpa benar-benar harus mengakses konten ketergantungan melingkar. Yang saya maksud dengan level teratas adalah baris-baris yang akan dieksekusi selama kompilasi yang bertentangan dengan isi fungsi (mis.
y = x.y
). Variabel statis atau kelas yang mengakses konten modul juga akan menyebabkan masalah.sumber
Jika Anda tidak ingin mengubah logika, Anda bisa meletakkan beberapa pernyataan impor yang menyebabkan ImportError ke posisi file lainnya, misalnya akhir.
a.py
b.py
Tetapi jika kita mengubah posisi dari test.b impor b2 dalam A seperti di bawah ini:
a.py
Dan kita bisa mendapatkan apa yang kita inginkan:
sumber
Ini adalah ketergantungan sirkuler. kita bisa menyelesaikan masalah ini dengan menggunakan modul impor atau kelas atau fungsi di mana kita perlu. jika kita menggunakan pendekatan ini, kita dapat memperbaiki ketergantungan sirkuler
A.py
B.py
sumber
Saya baru saja mendapatkan kesalahan ini juga, untuk alasan yang berbeda ...
Script utama memiliki ujung garis Windows.
my_sub_module
memiliki ujung garis UNIX. Mengubahnya menjadi sama memperbaiki masalah. Mereka juga harus memiliki pengkodean karakter yang sama.sumber
Seperti yang telah disebutkan, ini disebabkan oleh ketergantungan melingkar . Apa yang belum disebutkan adalah bahwa ketika Anda menggunakan modul pengetikan Python dan Anda mengimpor kelas hanya untuk digunakan untuk membubuhi keterangan Jenis , Anda dapat menggunakan referensi Teruskan :
dan hapus dependensi ( impor ), mis. alih-alih
melakukan:
(perhatikan
import
pernyataan yang dihapus )sumber
Jangan beri nama skrip python Anda saat ini dengan nama beberapa modul lain yang Anda impor
Solusi: ganti nama skrip python Anda
Contoh:
medicaltorch.py
from medicaltorch import datasets as mt_datasets
manamedicaltorch
seharusnya modul terpasangIni akan gagal dengan
ImportError
. Cukup ganti nama skrip python Anda dalam 1.sumber
Belum melihatnya di sini - ini sangat bodoh, tetapi pastikan Anda mengimpor variabel / fungsi yang benar.
Saya mendapatkan kesalahan ini
karena variabel saya sebenarnya
IMPLICIT_TIMEOUT
.ketika saya mengubah impor saya untuk menggunakan nama yang benar, saya tidak lagi mendapatkan kesalahan 🤦♂️
sumber
from PIL import Pillow
tidak berhasil. 😠Jika Anda mengimpor
file1.py
darifile2.py
dan menggunakan ini:Variabel di bawah ini yang
file1.py
tidak dapat diimpor kefile2.py
karena__name__
tidak sama__main__
!Jika Anda ingin mengimpor sesuatu dari
file1.py
kefile2.py
, Anda harus menggunakan ini difile1.py
:Jika ragu, buat
assert
pernyataan untuk menentukan apakah__name__=='__main__'
sumber
Salah satu cara untuk melacak kesalahan impor adalah langkah demi langkah mencoba menjalankan python pada setiap file yang diimpor untuk melacak yang buruk.
Anda mendapatkan sesuatu seperti:
maka Anda meluncurkan:
maka Anda meluncurkan:
sumber
Juga tidak secara langsung relevan dengan OP, tetapi gagal untuk me - restart konsol PyCharm Python, setelah menambahkan objek baru ke modul, juga merupakan cara yang bagus untuk mendapatkan yang sangat membingungkan
ImportError: Cannot import name ...
Bagian yang membingungkan adalah PyCharm itu akan melengkapi impor secara otomatis di konsol, tetapi impor tersebut kemudian gagal.
sumber
Masalahnya jelas: ketergantungan melingkar antara nama di
entity
danphysics
modul.Terlepas dari mengimpor seluruh modul atau hanya kelas, nama harus dimuat.
Tonton contoh ini:
Ini akan dikompilasi menjadi:
Dengan satu perubahan kecil kita dapat menyelesaikan ini:
Ini akan dikompilasi menjadi:
sumber
Dalam kasus saya, saya bekerja di notebook Jupyter dan ini terjadi karena impor sudah di-cache sejak saya mendefinisikan kelas / fungsi di dalam file kerja saya.
Saya memulai kembali kernel Jupyter saya dan kesalahannya hilang.
sumber
Tidak khusus untuk penanya ini, tetapi kesalahan yang sama ini akan muncul jika nama kelas dalam impor Anda tidak cocok dengan definisi dalam file yang Anda impor.
sumber