Tôi có một số mã lan truyền trên nhiều tệp cố gắng
from entity import Ent
class Physics:
...
9 từ nhau, như sau:main.py:
from entity import Ent
entity.py:
from physics import Physics
class Ent:
...
physics.py:
from entity import Ent
class Physics:
...
Sau đó tôi chạy từ
Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
0 và tôi gặp lỗi sau:Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
Tôi cho rằng lỗi là do nhập
Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
1 hai lần - một lần trong Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
0 và sau đó trong Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
3 - nhưng làm thế nào tôi có thể giải quyết vấn đề?Xem thêm những gì xảy ra khi sử dụng nhập khẩu lẫn nhau hoặc tròn [tuần hoàn] trong Python? Đối với một tổng quan chung về những gì được cho phép và nguyên nhân gây ra một vấn đề nhập khẩu thông tư WRT. Xem tại sao nhập khẩu thông tư dường như hoạt động xa hơn trong ngăn xếp cuộc gọi nhưng sau đó nâng một nhà nhập khẩu xuống xa hơn? Để biết chi tiết kỹ thuật về lý do và cách xảy ra vấn đề.why and how the problem occurs.
Karl Knechtel
59.4K10 Huy hiệu vàng86 Huy hiệu bạc132 Huy hiệu đồng10 gold badges86 silver badges132 bronze badges
hỏi ngày 12 tháng 2 năm 2012 lúc 20:49Feb 12, 2012 at 20:49
6
Bạn có nhập khẩu phụ thuộc tròn.
Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
3 được nhập từ Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
1 trước khi lớp Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
6 được xác định và Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
7 cố gắng nhập Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
1 đã khởi tạo. Hủy bỏ sự phụ thuộc vào Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
7 khỏi mô -đun Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
1.
Arkady
13,5K7 Huy hiệu vàng39 Huy hiệu bạc46 Huy hiệu đồng7 gold badges39 silver badges46 bronze badges
Đã trả lời ngày 12 tháng 2 năm 2012 lúc 21:01Feb 12, 2012 at 21:01
Teemu Ikonentemu IkonenTeemu Ikonen
11.7K4 Huy hiệu vàng22 Huy hiệu bạc35 Huy hiệu Đồng4 gold badges22 silver badges35 bronze badges
1
Mặc dù bạn chắc chắn nên tránh các phụ thuộc tròn, bạn có thể trì hoãn nhập khẩu trong Python.
Ví dụ:
import SomeModule
def someFunction[arg]:
from some.dependency import DependentClass
Điều này [ít nhất là trong một số trường hợp] sẽ phá vỡ lỗi.
Đã trả lời ngày 28 tháng 8 năm 2013 lúc 11:40Aug 28, 2013 at 11:40
Bharlingbharlingbharling
2.7501 Huy hiệu vàng17 Huy hiệu bạc25 Huy hiệu đồng1 gold badge17 silver badges25 bronze badges
2
Đây là một phụ thuộc tròn. Nó có thể được giải quyết mà không có bất kỳ sửa đổi cấu trúc cho mã. Vấn đề xảy ra vì trong
import SomeModule
def someFunction[arg]:
from some.dependency import DependentClass
1 bạn yêu cầu Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
1 được cung cấp để sử dụng ngay lập tức và ngược lại. Lý do cho vấn đề này là bạn yêu cầu truy cập nội dung của mô -đun trước khi nó sẵn sàng - bằng cách sử dụng import SomeModule
def someFunction[arg]:
from some.dependency import DependentClass
3. Điều này về cơ bản giống nhưimport x
y = x.y
del x
Python có thể phát hiện các phụ thuộc tròn và ngăn chặn vòng lặp nhập khẩu vô hạn. Về cơ bản, tất cả những gì xảy ra là một trình giữ chỗ trống được tạo cho mô -đun [nghĩa là nó không có nội dung]. Khi các mô -đun phụ thuộc tròn được biên dịch, nó sẽ cập nhật mô -đun đã nhập. Đây là hoạt động như thế này.
a = module[] # import a
# rest of module
a.update_contents[real_a]
Để Python có thể làm việc với các phụ thuộc tròn, bạn phải chỉ sử dụng kiểu
import SomeModule
def someFunction[arg]:
from some.dependency import DependentClass
4.import x
class cls:
def __init__[self]:
self.y = x.y
Vì bạn không còn đề cập đến nội dung của mô -đun ở cấp cao nhất, Python có thể biên dịch mô -đun mà không thực sự phải truy cập vào nội dung của phụ thuộc tròn. Theo cấp cao nhất, tôi có nghĩa là các dòng sẽ được thực thi trong quá trình biên dịch trái ngược với nội dung của các hàm [ví dụ:
import SomeModule
def someFunction[arg]:
from some.dependency import DependentClass
5]. Các biến tĩnh hoặc lớp truy cập vào nội dung mô -đun cũng sẽ gây ra vấn đề.Đã trả lời ngày 23 tháng 5 năm 2014 lúc 19:11May 23, 2014 at 19:11
DunesdunesDunes
Phim huy hiệu vàng 35,9k77 gold badges78 silver badges93 bronze badges
0
Trong trường hợp của tôi, tôi đã làm việc trong một máy tính xách tay Jupyter và điều này đã xảy ra do việc nhập đã được lưu trữ từ khi tôi xác định lớp/chức năng trong tệp làm việc của tôi.
Tôi đã khởi động lại hạt nhân Jupyter của mình và lỗi đã biến mất.
Đã trả lời ngày 23 tháng 4 năm 2020 lúc 1:04Apr 23, 2020 at 1:04
Harry mharry mHarry M
1.7083 huy hiệu vàng19 Huy hiệu bạc34 Huy hiệu đồng3 gold badges19 silver badges34 bronze badges
0
Để làm cho logic rõ ràng là rất quan trọng. Vấn đề này xuất hiện, bởi vì tài liệu tham khảo trở thành một vòng lặp chết.
Nếu bạn không muốn thay đổi logic, bạn có thể đặt một số câu lệnh nhập khiến nhập khẩu vào vị trí khác của tệp, ví dụ như kết thúc.
a.py
from test.b import b2
def a1[]:
print['a1']
b2[]
b.py
from test.a import a1
def b1[]:
print['b1']
a1[]
def b2[]:
print['b2']
if __name__ == '__main__':
b1[]
Bạn sẽ nhận được lỗi nhập:
6import SomeModule def someFunction[arg]: from some.dependency import DependentClass
Nhưng nếu chúng ta thay đổi vị trí từ Test.b Nhập B2 ở mức như dưới đây:
a.py
from physics import Physics
class Ent:
...
0Và chúng ta có thể có được những gì chúng ta muốn:
from physics import Physics
class Ent:
...
1Đã trả lời ngày 20 tháng 11 năm 2017 lúc 13:59Nov 20, 2017 at 13:59
g10guangg10guangg10guang
4.1093 Huy hiệu vàng27 Huy hiệu bạc22 Huy hiệu Đồng3 gold badges27 silver badges22 bronze badges
0
Đây là một phụ thuộc tròn. Chúng tôi có thể giải quyết vấn đề này bằng cách sử dụng mô -đun nhập khẩu hoặc lớp hoặc chức năng khi chúng tôi cần. Nếu chúng ta sử dụng phương pháp này, chúng ta có thể khắc phục sự phụ thuộc trònimport module or class or function where we needed. if we use this approach, we can fix circular dependency
A.py
from physics import Physics
class Ent:
...
2B.py
from physics import Physics
class Ent:
...
3Đã trả lời ngày 3 tháng 5 năm 2019 lúc 9:14May 3, 2019 at 9:14
Tôi cũng đã nhận được lỗi này, vì một lý do khác ...
from physics import Physics
class Ent:
...
4Kịch bản chính có kết thúc dòng Windows.
import SomeModule
def someFunction[arg]:
from some.dependency import DependentClass
7 có kết thúc dòng Unix. Thay đổi chúng để được cùng một vấn đề. Họ cũng cần phải có cùng một mã hóa ký tự.Đã trả lời ngày 7 tháng 4 năm 2017 lúc 11:52Apr 7, 2017 at 11:52
Marengazmarengazmarengaz
1.53916 huy hiệu bạc28 Huy hiệu đồng16 silver badges28 bronze badges
Như đã đề cập, điều này được gây ra bởi một sự phụ thuộc tròn. Điều chưa được đề cập là khi bạn sử dụng mô -đun gõ Python và bạn chỉ nhập một lớp để được sử dụng để chú thích các loại, bạn có thể sử dụng các tài liệu tham khảo chuyển tiếp:circular dependency. What has not been mentioned is that when you're using Python typing module and you import a class only to be used to annotate Types, you can use Forward references:
Khi một gợi ý loại chứa các tên chưa được xác định, định nghĩa đó có thể được biểu thị dưới dạng chuỗi theo nghĩa đen, sẽ được giải quyết sau đó.
và loại bỏ sự phụ thuộc [nhập], ví dụ: thay vì
from physics import Physics
class Ent:
...
5do:
from physics import Physics
class Ent:
...
6[Lưu ý câu lệnh
from entity import Ent
class Physics:
...
9 đã xóa]Đã trả lời ngày 10 tháng 1 năm 2020 lúc 18:19Jan 10, 2020 at 18:19
1
Vấn đề rất rõ ràng: sự phụ thuộc tròn giữa các tên trong các mô -đun
Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
1 và Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
7.circular dependency between names in Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
1 and Traceback [most recent call last]:
File "main.py", line 2, in
from entity import Ent
File ".../entity.py", line 5, in
from physics import Physics
File ".../physics.py", line 2, in
from entity import Ent
ImportError: cannot import name Ent
7 modules.Bất kể nhập toàn bộ mô -đun hay chỉ là một lớp, các tên phải được tải.
Xem ví dụ này:
from physics import Physics
class Ent:
...
7from physics import Physics
class Ent:
...
8Điều này sẽ được biên dịch thành:
from physics import Physics
class Ent:
...
9Với một thay đổi nhỏ, chúng ta có thể giải quyết điều này:
from entity import Ent
class Physics:
...
0from entity import Ent
class Physics:
...
1Điều này sẽ được biên dịch thành:
from entity import Ent
class Physics:
...
2Với một thay đổi nhỏ, chúng ta có thể giải quyết điều này:Apr 13, 2020 at 16:29
Đã trả lời ngày 13 tháng 4 năm 2020 lúc 16:29DuniC
Dunicdunic2 silver badges6 bronze badges
0
2232 Huy hiệu bạc6 Huy hiệu đồngrename your working python script
Hãy thử giải pháp này: Đổi tên tập lệnh Python làm việc của bạn
Example:
- Bạn không nên đặt tên cho tập lệnh Python hiện tại của bạn với tên của một số mô -đun khác mà bạn nhập, vì bạn sẽ gặp lỗi đó.
- Bạn đang làm việc trong
1import x y = x.y del x
Trong tập lệnh đó, bạn có:
import x
y = x.y
del x
2 trong đó import x
y = x.y
del x
3 được cho là một mô -đun được cài đặt riêngĐiều này sẽ thất bại với
import x
y = x.y
del x
4 vì 2 điều đề cập đến import x
y = x.y
del x
3Vì vậy, chỉ cần đổi tên tập lệnh Python làm việc của bạn trong 1.Oct 17, 2018 at 23:56
Đã trả lời ngày 17 tháng 10 năm 2018 lúc 23:56Paul
Paulpaul29 silver badges28 bronze badges
0
3.54229 Huy hiệu bạc28 Huy hiệu đồng
from entity import Ent
class Physics:
...
3Nếu bạn đang nhập
import x
y = x.y
del x
6 từ import x
y = x.y
del x
7 và sử dụng điều này:cannot be imported to import x
y = x.y
del x
7 because a = module[] # import a
# rest of module
a.update_contents[real_a]
0 does not equal a = module[] # import a
# rest of module
a.update_contents[real_a]
1! Các biến dưới đây trong
import x
y = x.y
del x
6 không thể được nhập vào import x
y = x.y
del x
7 vì a = module[] # import a
# rest of module
a.update_contents[real_a]
0 không bằng a = module[] # import a
# rest of module
a.update_contents[real_a]
1!from entity import Ent
class Physics:
...
4Nếu bạn muốn nhập một cái gì đó từ
import x
y = x.y
del x
6 vào import x
y = x.y
del x
7, bạn cần sử dụng nó trong import x
y = x.y
del x
6:Trong trường hợp nghi ngờ, hãy đưa ra tuyên bố
a = module[] # import a
# rest of module
a.update_contents[real_a]
5 để xác định xem a = module[] # import a
# rest of module
a.update_contents[real_a]
6 cóDec 20, 2019 at 23:31
Đã trả lời ngày 20 tháng 12 năm 2019 lúc 23:31Nicolas Gervais
Nicolas Gervaisnicolas Gervais11 gold badges105 silver badges128 bronze badges
Phù bằng vàng 31K11
Một cách để theo dõi lỗi nhập là từng bước cố gắng chạy Python trên mỗi tệp đã nhập để theo dõi cái xấu.
5from entity import Ent class Physics: ...
Bạn nhận được một cái gì đó như:
Bước nhập khẩu: Không thể nhập tên
6from entity import Ent class Physics: ...
Sau đó, bạn khởi chạy:
Bước nhập khẩu: Không thể nhập tên
7from entity import Ent class Physics: ...
Sau đó, bạn khởi chạy:
Bước nhập khẩu: Không thể nhập tên B
IrtUterror: Không thể nhập tên C [một số mô-đun không tồn tại hoặc một số lỗi khác]17 gold badges43 silver badges53 bronze badges
TomNov 12, 2019 at 11:39
16K17 Huy hiệu vàng43 Huy hiệu bạc53 Huy hiệu đồngEvalds Urtans
Đã trả lời ngày 12 tháng 11 năm 2019 lúc 11:391 gold badge40 silver badges30 bronze badges
Evalds Urtansevalds Urtans
6.2061 Huy hiệu vàng40 Huy hiệu bạc 30 Huy hiệu Đồng
Cũng không liên quan trực tiếp đến OP, nhưng không khởi động lại bảng điều khiển Pycharm Python, sau khi thêm một đối tượng mới vào mô -đun, cũng là một cách tuyệt vời để có được một
a = module[] # import a
# rest of module
a.update_contents[real_a]
7 rất khó hiểuNov 29, 2019 at 22:14
Phần khó hiểu là Pycharm sẽ tự động hoàn thành việc nhập trong bảng điều khiển, nhưng việc nhập sau đó không thành công.djvg
Đã trả lời ngày 29 tháng 11 năm 2019 lúc 22:144 gold badges58 silver badges91 bronze badges
DJVGDJVG
9.3144 Huy hiệu vàng58 Huy hiệu bạc91 Huy hiệu Đồng
Đừng thấy cái này ở đây - điều này cực kỳ ngu ngốc, nhưng hãy chắc chắn rằng bạn đang nhập đúng biến/chức năng.
Tôi đã nhận được lỗi này
Bước nhập khẩu: Không thể nhập tên Insplict_wait
Bởi vì biến của tôi thực sự là
a = module[] # import a
# rest of module
a.update_contents[real_a]
8.Oct 19, 2018 at 17:51
Khi tôi thay đổi nhập để sử dụng đúng tên, tôi không còn gặp lỗi nữaNick Brady
Đã trả lời ngày 19 tháng 10 năm 2018 lúc 17:511 gold badge44 silver badges68 bronze badges
0
Nick Bradynick Brady
5.6571 Huy hiệu vàng44 Huy hiệu bạc68 Huy hiệu đồngOct 14, 2019 at 21:01
Không dành riêng cho người hỏi này, nhưng lỗi tương tự này sẽ hiển thị nếu tên lớp trong nhập của bạn không khớp với định nghĩa trong tệp bạn đang nhập từ.Bennett
Đã trả lời ngày 14 tháng 10 năm 2019 lúc 21:012 gold badges6 silver badges16 bronze badges
Bennettbennett
from entity import Ent
class Physics:
...
83172 Huy hiệu vàng6 Huy hiệu bạc16 Huy hiệu đồng
Trong trường hợp của tôi, chỉ cần bỏ lỡ tên tệp:
trong đó
9 là tệp.18 gold badges19 silver badges37 bronze badgesa = module[] # import a
# rest of module
a.update_contents[real_a]
CottectailSep 25, 2020 at 7:02
sailfish009sailfish009sailfish009
4.43218 Huy hiệu vàng19 Huy hiệu bạc37 Huy hiệu đồng1 gold badge23 silver badges30 bronze badges
Đã trả lời ngày 25 tháng 9 năm 2020 lúc 7:02
2.3501 Huy hiệu vàng23 Huy hiệu bạc 30 Huy hiệu Đồng
Trong trường hợp của tôi, chỉ cần bỏ lỡ tên tệp:
trong đó
9 là tệp.18 gold badges19 silver badges37 bronze badgesa = module[] # import a
# rest of module
a.update_contents[real_a]
CottectailSep 6 at 4:19
4.43218 Huy hiệu vàng19 Huy hiệu bạc37 Huy hiệu đồngWade Wang
Đã trả lời ngày 25 tháng 9 năm 2020 lúc 7:024 silver badges11 bronze badges