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

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
0

Kết quả là:

________số 8

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

from module3 import testMethod4
7 error generally occurs when the imported class is not accessible, or the imported class is in a circular dependency.

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:

from module3 import testMethod4
9 và
def testMethod4[]:
0, như được hiển thị bên dưới.
Consider you have two modules:
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:

from module3 import testMethod4
9

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:

def testMethod4[]:
0

from module2 import testMethod1, testMethod2
def testMethodY[]:
    ...
    ...
    ...
0

Bạn có thể tìm thấy sự phụ thuộc tròn không?

Output:

from module2 import testMethod1, testMethod2
def testMethodY[]:
    ...
    ...
    ...
1

Lỗ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ó:

from module3 import testMethod4
9

from module2 import testMethod1, testMethod2
def testMethodY[]:
    ...
    ...
    ...
2

Và trên mô -đun thứ hai!

def testMethod4[]:
0

from module2 import testMethod1, testMethod2
def testMethodY[]:
    ...
    ...
    ...
3

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

Có 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:

from module3 import testMethod4
9

from module2 import testMethod1, testMethod2
def testMethodY[]:
    ...
    ...
    ...
5

Output:

from module2 import testMethod1, testMethod2
def testMethodY[]:
    ...
    ...
    ...
4

Sự 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
4

ImportError: cannot import name testMethod4
5

Khó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

Làm thế nào để sửa lỗi nhập khẩu không thể nhập tên?

Nếu lỗi xảy ra do sự phụ thuộc tròn, nó có thể được giải quyết bằng cách chuyển các lớp đã nhập sang tệp thứ ba và nhập chúng từ tệp này.Nếu lỗi xảy ra do tên sai, tên của lớp trong tệp Python phải được xác minh và sửa chữa.moving the imported classes to a third file and importing them from this file. If the error occurs due to a misspelled name, the name of the class in the Python file should be verified and corrected.

Gói thử nghiệm trong Python là gì?

Mỗi mô -đun trong gói thử nghiệm có tên bắt đầu bằng Test_ là bộ thử nghiệm cho một mô -đun hoặc tính năng cụ thể.Tất cả các bài kiểm tra mới nên được viết bằng mô -đun Unittest hoặc DocTest.Một số thử nghiệm cũ được viết bằng cách sử dụng kiểu thử nghiệm truyền thống của người Viking so sánh đầu ra được in với SYS.a testing suite for a specific module or feature. All new tests should be written using the unittest or doctest module. Some older tests are written using a “traditional” testing style that compares output printed to sys.

Chủ Đề