Hướng dẫn cannot import name from python - không thể nhập tên từ python

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.

Hướng dẫn cannot import name from python - không thể nhập tên từ python

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.

Hướng dẫn cannot import name from python - không thể nhập tên từ python

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:

import SomeModule

def someFunction(arg):
    from some.dependency import DependentClass
6

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:
    ...
0

Và 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:
    ...
2

B.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:
    ...
4

Kị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

Hướng dẫn cannot import name from python - không thể nhập tên từ python

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:
    ...
5

do:

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

Hướng dẫn cannot import name from python - không thể nhập tên từ python

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:
    ...
7
from physics import Physics
class Ent:
    ...
8

Điều này sẽ được biên dịch thành:

from physics import Physics
class Ent:
    ...
9

Vớ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:
    ...
0
from entity import Ent
class Physics:
    ...
1

Điều này sẽ được biên dịch thành:

from entity import Ent
class Physics:
    ...
2

Vớ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:

  1. 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 đó.
  2. Bạn đang làm việc trong
    import x
    y = x.y
    del x
    
    1

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
3

Vì 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

Hướng dẫn cannot import name from python - không thể nhập tên từ python

Đã 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:
    ...
3

Nế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:
    ...
4

Nế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

Hướng dẫn cannot import name from python - không thể nhập tên từ python

Đã 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

  1. 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.

    from entity import Ent
    class Physics:
        ...
    
    5

    Bạn nhận được một cái gì đó như:

  2. Bước nhập khẩu: Không thể nhập tên

    from entity import Ent
    class Physics:
        ...
    
    6

    Sau đó, bạn khởi chạy:

  3. Bước nhập khẩu: Không thể nhập tên

    from entity import Ent
    class Physics:
        ...
    
    7

    Sau đó, bạn khởi chạy:

Hướng dẫn cannot import name from python - không thể nhập tên từ python

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

Hướng dẫn cannot import name from python - không thể nhập tên từ python

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

Hướng dẫn cannot import name from python - không thể nhập tên từ python

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:
    ...
8

3172 Huy hiệu vàng6 Huy hiệu bạc16 Huy hiệu đồng

Hướng dẫn cannot import name from python - không thể nhập tên từ python

Trong trường hợp của tôi, chỉ cần bỏ lỡ tên tệp:

trong đó

a = module() # import a

# rest of module

a.update_contents(real_a)
9 là tệp.18 gold badges19 silver badges37 bronze badges

CottectailSep 25, 2020 at 7:02

Hướng dẫn cannot import name from python - không thể nhập tên từ python

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

Hướng dẫn cannot import name from python - không thể nhập tên từ python

Trong trường hợp của tôi, chỉ cần bỏ lỡ tên tệp:

trong đó

a = module() # import a

# rest of module

a.update_contents(real_a)
9 là tệp.18 gold badges19 silver badges37 bronze badges

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

Làm cách nào để sửa lỗi nhập Python?

Python's Irtunterror (ModulenotFounderRor) chỉ ra rằng bạn đã cố gắng nhập một mô -đun mà Python không tìm thấy.Nó thường có thể được loại bỏ bằng cách thêm một tệp có tên __init__.py vào thư mục và sau đó thêm thư mục này vào $ pythonpath.adding a file named __init__.py to the directory and then adding this directory to $PYTHONPATH .

Tại sao tôi không thể nhập chức năng từ một tệp python?

Python "Bộ nhập khẩu: Không thể nhập tên" thường xảy ra khi chúng tôi có nhập vòng tròn (nhập thành viên giữa cùng một tệp).Để giải quyết lỗi, di chuyển các chức năng hoặc lớp sang tệp thứ ba và nhập chúng từ vị trí trung tâm trong các tệp khác.move the functions or classes to a third file and import them from a central location in other files.

__ init __ py làm gì trong python?

Các tệp __init__.py được yêu cầu để làm cho các thư mục xử lý Python chứa tệp dưới dạng các gói.Điều này ngăn các thư mục có tên chung, chẳng hạn như chuỗi, vô tình ẩn các mô -đun hợp lệ xảy ra sau đó trên đường dẫn tìm kiếm mô -đun.make Python treat directories containing the file as packages. This prevents directories with a common name, such as string , unintentionally hiding valid modules that occur later on the module search path.