Tôi có mã nguồn Python và cấu trúc mã nhất quán trong hệ thống phân cấp sau:
bin/
module1.py
module2.py
module3.py
test/
module1_test.py
Mã trong các mô -đun như sau: Module1.py
from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
module2.py
from module3 import testMethod4
module3.py
def testMethod4[]:
module1_test.py
import unittest
import sys, os
path = os.path.dirname[__file__]
path = os.path.join[path, 'bin']
sys.path.append["/bin"]
from module1 import testMethodY
...[Some code for unit test]
Khi tôi chạy python module1_test.py nó không thành công với lỗi nhập:
ImportError: cannot import name testMethod4
Không chắc chắn điều gì là sai. Nếu tôi chạy mã nguồn thì tất cả các nhập khẩu đều hoạt động tốt. Nhưng với Python nhất quán, những nhập khẩu tương đối này đang thất bại. Bất cứ ai có thể cho tôi biết tôi đang làm sai lầm gì.
Hi.
Tôi có một cấu trúc thư mục như thế này:
project
|-- __init__.py
|-- cli.py
|-- app
| |-- __init__.py # Empty file
| |-- main.py
| |-- submodule.py
|-- tests
| |-- __init__.py
| |-- test_app.py
from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
7 Nhập khẩu from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
8.Trong
from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
9 Tôi muốn kiểm tra Submodule.py, vì vậy tôi làm điều gì đó như thế này trong một bài kiểm tra:import app
instanceOfClass = app.submodule.classA[]
Khi trong thư mục dự án, tôi chạy các bài kiểm tra như thế này:
from module3 import testMethod4
0Kết quả là:
________số 8Vì vậy, rõ ràng, khi nhập Ứng dụng, mã nhìn vào
from module3 import testMethod4
1 của ứng dụng và sẽ không cho phép tôi nhập trực tiếp mô hình con.Tôi có thể làm gì để có thể nhập
from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
8 trực tiếp trong mã của mình? [toc]
Cách khắc phục: Bộ nhập khẩu: Không thể nhập tên X X trong Python?
Giới thiệu
Lỗi nhập khẩu có thể xảy ra trong nhiều trường hợp và kịch bản. Một số ví dụ cổ điển về lỗi nhập đã được giải thích trong các hướng dẫn sau:
- [Đã sửa] Bộ nhập khẩu: Không có mô -đun có tên yêu cầu
- Cách sửa lỗi của Itractorror: Không có mô -đun có tên Pandas [[Mac/Linux/Windows/Pycharm]
Trong bài viết này, bạn sẽ tìm hiểu về một lỗi nhập khẩu khác thường xảy ra trong khi bạn đang xử lý các gói và phụ thuộc trong Python.
Tóm tắt nhanh để nhập tuyên bố và nhập khẩu
Trong Python, tuyên bố & nbsp; ____ 23 & nbsp; phục vụ hai mục đích chính:
- Nó được sử dụng để tìm kiếm mô -đun được chỉ định bởi tên của nó, sau đó tải và khởi tạo nó nếu cần mô -đun.
- Nó cũng xác định một tên trong không gian tên cục bộ trong phạm vi của câu lệnh nhập. Tên địa phương này sau đó có thể được sử dụng để tham khảo mô -đun được truy cập trong toàn bộ mã.
Nếu một tuyên bố ____24 gặp khó khăn trong việc nhập thành công một mô -đun, nó sẽ tăng & nbsp; ________ 25.
Thông thường, một vấn đề như vậy xảy ra do cài đặt bị lỗi hoặc đường dẫn không hợp lệ, thường sẽ tăng A & nbsp; ____ ____ 26 & nbsp; in & nbsp; Python 3.6 và các phiên bản mới hơn.
Xây dựng vấn đề
Hãy thử hiểu vấn đề tốt hơn một chút trước khi chúng ta đi vào giải pháp!
Trong Python & nbsp; ________ 27 & nbsp; lỗi thường xảy ra khi lớp nhập khẩu không thể truy cập được hoặc lớp nhập được nhập vào một phụ thuộc tròn.
7 error generally occurs when the imported class is not accessible, or the imported class is in a circular dependency. from module3 import testMethod4
Sau đây là những lý do chính cho sự xuất hiện của
from module3 import testMethod4
8- Lớp nhập khẩu là trong một phụ thuộc tròn.circular dependency.
- Lớp nhập khẩu không có sẵn hoặc chưa được tạo.
- Lớp nhập khẩu đã được sai chính tả.
- Lớp nhập từ một mô -đun cụ thể bị đặt sai chỗ.
- Lớp nhập khẩu không có trong thư viện Python. Điều này thường xảy ra trong khi nhập các thư viện bên ngoài.
Ví dụ: Hãy xem xét bạn có hai mô -đun:
9 và from module3 import testMethod4
0, như được hiển thị bên dưới.Consider you have two modules: def testMethod4[]:
from module3 import testMethod4
9 and def testMethod4[]:
0, as shown below. Các tệp này thể hiện cách
def testMethod4[]:
1 xảy ra khi có sự phụ thuộc tròn giữa chúng, dẫn đến một tình huống vòng lặp chết.
Hãy cùng xem nội dung của mô -đun đầu tiên:
9from module3 import testMethod4
from x import x_1 def y_1[]: print['y1'] x_1[] def y_2[]: print['y2'] if __name__ == '__main__': y_1[]
Hãy cùng xem nội dung của mô -đun thứ hai:
0def testMethod4[]:
from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
0Bạn có thể tìm thấy sự phụ thuộc tròn không?
Output:
from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
1Lỗi xảy ra do cả hai tệp Python, tức là,
def testMethod4[]:
4 và def testMethod4[]:
5, đã cố gắng tải nhau đồng thời.Mô -đun
def testMethod4[]:
5 đã cố gắng tải mô -đun def testMethod4[]:
4 trong khi mô -đun def testMethod4[]:
4 đã cố gắng tải mô -đun def testMethod4[]:
5.def testMethod4[]:
5 module tried to load the def testMethod4[]:
4
module while the def testMethod4[]:
4 module attempted to load the def testMethod4[]:
5 module.Điều này tạo ra sự phụ thuộc tải tròn dẫn đến một lỗi trong bộ nhớ heap. Để loại bỏ
def testMethod4[]:
1, bạn phải loại bỏ sự phụ thuộc tròn.Giải pháp 1: Chỉ cần sử dụng nhập khẩu [Tránh từ X Nhập y]
Nói một cách đơn giản, vấn đề đang xảy ra vì chúng tôi đang cố gắng truy cập nội dung của một mô -đun từ một mô -đun khác đồng thời trước khi nội dung của mô -đun được sẵn sàng/khởi tạo.
Điều này xảy ra đặc biệt bởi vì bạn đang sử dụng:
import unittest
import sys, os
path = os.path.dirname[__file__]
path = os.path.join[path, 'bin']
sys.path.append["/bin"]
from module1 import testMethodY
...[Some code for unit test]
1 và ____42.Python có thể phát hiện các phụ thuộc tròn và ngăn chặn các vòng chết.
Về cơ bản, 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 chứa bất kỳ nội dung nào].
Sau khi các mô -đun phụ thuộc vào tròn được biên dịch, Python tự động cập nhật mô -đun đã nhập. & NBSP;
Tuy nhiên, để Python giải quyết vấn đề phụ thuộc tròn, bạn chỉ phải sử dụng
import unittest
import sys, os
path = os.path.dirname[__file__]
path = os.path.join[path, 'bin']
sys.path.append["/bin"]
from module1 import testMethodY
...[Some code for unit test]
3 thay vì nhập một nội dung cụ thể của mô -đun với sự trợ giúp của câu lệnh import unittest
import sys, os
path = os.path.dirname[__file__]
path = os.path.join[path, 'bin']
sys.path.append["/bin"]
from module1 import testMethodY
...[Some code for unit test]
4.import unittest
import sys, os
path = os.path.dirname[__file__]
path = os.path.join[path, 'bin']
sys.path.append["/bin"]
from module1 import testMethodY
...[Some code for unit test]
3 only instead of importing a particular content of the module with the help of the import unittest
import sys, os
path = os.path.dirname[__file__]
path = os.path.join[path, 'bin']
sys.path.append["/bin"]
from module1 import testMethodY
...[Some code for unit test]
4 statement. Vì bạn không còn cố gắng tải các nội dung riêng lẻ của mô -đun ở cấp cao nhất, Python có nhiều thời gian để biên dịch mô -đun, do đó tự xử lý sự phụ thuộc tròn.
Hãy cùng xem mã sau để hiểu cách thức hoạt động của nó:
9from module3 import testMethod4
from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
2Và trên mô -đun thứ hai!
0def testMethod4[]:
from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
3Bây giờ, nó có hoạt động hay Python gây ra lỗi phụ thuộc tròn?
Output:
from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
4Có nó hoạt động!
Giải pháp 2: Đặt hàng lại vị trí của báo cáo nhập khẩu
Trong ví dụ trên, bạn có thể tránh được sự phụ thuộc tròn bằng cách cải tổ trình tự các câu lệnh
from module3 import testMethod4
3.Do đó, thay vì nhập mô -đun
def testMethod4[]:
5 ở đầu trong mô -đun def testMethod4[]:
4, bạn có thể nhập nó sau, như được hiển thị trong đoạn trích sau:instead of importing the def testMethod4[]:
5 module at the beginning within the def testMethod4[]:
4 module, you can import it
later, as shown in the following snippet:
9from module3 import testMethod4
from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
5Output:
from module2 import testMethod1, testMethod2
def testMethodY[]:
...
...
...
4Sự kết luận
Để tổng hợp mọi thứ, bạn có thể giải quyết lỗi của ____ ____51 bằng cách giải quyết các phụ thuộc tròn.
Bạn có thể làm điều đó bằng cách loại bỏ việc sử dụng hình thức nhập nội dung
ImportError: cannot import name testMethod4
2 từ một mô -đun và chỉ cần sử dụng câu lệnh from module3 import testMethod4
3 để nhập toàn bộ mô -đun.Một cách giải quyết khác cho lỗi này là thay đổi vị trí của các báo cáo nhập tương ứng trong mã của bạn.
Tôi hy vọng hướng dẫn này đã trả lời các truy vấn của bạn. Vui lòng theo dõi và đăng ký để biết thêm các giải pháp và các cuộc thảo luận thú vị trong tương lai. Mã hóa hạnh phúc!stay tuned and subscribe for more solutions and interesting discussions in the future. Happy coding!
Lập trình viên hài hước
❓
ImportError: cannot import name testMethod4
4ImportError: cannot import name testMethod4
5Khóa học được đề xuất:
- Bạn có muốn làm chủ Python IDE phổ biến nhất không?
- Khóa học này sẽ đưa bạn từ người mới bắt đầu đến chuyên gia về Pycharm trong ~ 90 phút.
- Đối với bất kỳ nhà phát triển phần mềm nào, điều quan trọng là phải làm chủ IDE, viết, kiểm tra và gỡ lỗi mã chất lượng cao với rất ít nỗ lực.
Tôi là một blogger Python chuyên nghiệp và người tạo nội dung. Tôi đã xuất bản nhiều bài báo và tạo ra các khóa học trong một khoảng thời gian. Hiện tại tôi đang làm việc như một freelancer toàn thời gian và tôi có kinh nghiệm trong các lĩnh vực như Python, AWS, DevOps và Mạng.
Bạn có thể liên lạc với tôi @:
Upwork LinkedIn
LinkedIn