Lỗi nhập mũi Python


121

Tôi dường như không thể có được khung kiểm tra mũi để nhận ra các mô-đun bên dưới tập lệnh thử nghiệm của tôi trong cấu trúc tệp. Tôi đã thiết lập một ví dụ đơn giản nhất chứng minh vấn đề. Tôi sẽ giải thích nó dưới đây.

Đây là cấu trúc tệp gói:

./__init__.py
./foo.py
./tests
   ./__init__.py
   ./test_foo.py

foo.py chứa:

def dumb_true():
    return True

tests / test_foo.py chứa:

import foo

def test_foo():
    assert foo.dumb_true()

Cả hai tệp init .py đều trống

Nếu tôi chạy nosetests -vvtrong thư mục chính (nơi có foo.py), tôi nhận được:

Failure: ImportError (No module named foo) ... ERROR

======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 379, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 39, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 86, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
    import foo
ImportError: No module named foo

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)

Tôi gặp lỗi tương tự khi chạy từ bên trong thư mục tests /. Theo tài liệu và một ví dụ tôi tìm thấy, mũi được cho là thêm tất cả các gói mẹ vào đường dẫn cũng như thư mục mà từ đó nó được gọi, nhưng điều này dường như không xảy ra trong trường hợp của tôi.

Tôi đang chạy Ubuntu 8.04 với Python 2.6.2. Tôi đã xây dựng và cài đặt mũi theo cách thủ công (không phải với setup_tools) nếu điều đó quan trọng.

Câu trả lời:


226

Bạn có một __init__.pytrong thư mục cấp cao nhất của mình. Điều đó làm cho nó trở thành một gói. Nếu bạn loại bỏ nó, của bạn nosetestssẽ hoạt động.

Nếu bạn không xóa nó, bạn sẽ phải thay đổi tên của bạn importthành import dir.foo, đâu dirlà tên thư mục của bạn.


7
Đó là nó. Cảm ơn nhiều! Tôi muốn bỏ phiếu, nhưng dường như tôi cần thêm danh tiếng.
Halfak

4
Đừng lo lắng. Chào mừng bạn đến với StackOverflow! Bạn có thể đánh dấu vào dấu kiểm màu xanh lá cây ở bên trái nếu câu trả lời giải quyết được vấn đề của bạn.
ire_and_curses

2
@halfak: Có một ủng hộ khác cho câu hỏi của bạn. Bạn cũng vậy (về câu trả lời của bạn), @ire.
Mark Rushakoff

1
Hiểu rồi. Cảm ơn vì mẹo :)
halfak

5
Tôi gặp tình huống trong đó các bài kiểm tra hoạt động nếu init .py trong thư mục gốc - tuy nhiên, tôi cần tệp đó ở đó và nhập các mô hình. Vẫn không tìm thấy <model_name> . Kiểm tra bên trong thư mục / tests và mô hình tôi đang cố gắng kiểm tra nằm trong thư mục / mô hình ... mọi trợ giúp sẽ được đánh giá cao.
Kees Briggs

32

Bạn đang ở trong một virtualenv? Trong trường hợp của tôi, nosetestslà một trong /usr/bin/nosetests, đang sử dụng /usr/bin/python. Các gói trong virtualenv chắc chắn sẽ không nằm trong đường dẫn hệ thống. Phần sau đã khắc phục điều này:

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests

2
Cũng là của tôi. Cảm ơn bạn, đã tiết kiệm rất nhiều thời gian.
jskulski

3
đối với tôi nosetestsđã được lưu vào bộ nhớ cache của bashhệ thống một trong /usr/local/bin(trong khi which nosetestsđang cho kết quả thích hợp). Tôi đã sử dụng điều này để xóa nó.
Raffi

5
Ngoài ra, tôi phải hủy kích hoạt và kích hoạt virtualenv của mình.
Kéo dài

Tôi gặp sự cố với thiết lập PS1 = $ {PS1: -} khi kích hoạt virtualenv (để khắc phục lỗi trên các biến chưa đặt). Sau khi xóa cái này và chuyển sang set + u , tôi không gặp vấn đề gì nữa.
Juuso Ohtonen

13

Gửi đến những bạn tìm thấy câu hỏi này sau này: Tôi gặp lỗi nhập nếu tôi không có __init__.pytệp trong thư mục thử nghiệm của mình.

Cấu trúc thư mục của tôi như thế này:

./tests/
  ./test_some_random_stuff.py

Nếu tôi chạy nosetests:

nosetests -w tests

Nó sẽ cung cấp cho ImportError người khác đang nhìn thấy. Nếu tôi thêm một __init__.pytệp trống, nó hoạt động tốt:

./tests/
  ./__init__.py
  ./test_some_random_stuff.py

10

Một vấn đề tiềm ẩn khác xuất hiện là dấu gạch ngang / dấu gạch ngang trong cây thư mục. Gần đây, tôi đã khắc phục sự cố ImportError bằng cách đổi tên thư mục từ sub-dirthành sub_dir.



1
@Aman, bạn có nhận ra sự khác biệt giữa số nhận dạng biến và tên tệp không?
Nakilon

Vâng ... Tôi luôn có một tệp tương tự như FooTests.py và vì một số lý do không thích nó ... Tôi đã đổi tên thành Foo_Tests.py và nó hoạt động ... có vẻ hơi khó.
Birdman

3

Tất nhiên nếu bạn có lỗi cú pháp trong mô-đun được nhập sẽ gây ra điều này. Đối với tôi, vấn đề xảy ra khi tôi có một bản sao lưu của một tệp kiểm tra với đường dẫn như module / tests.bak.py trong cùng một thư mục với tests.py. Ngoài ra, để đối phó với sự cố gói / mô-đun init trong ứng dụng Django, bạn có thể chạy phần sau (trong trình bao bash / OSX) để đảm bảo rằng bạn không có bất kỳ tệp .pyc init nào nằm xung quanh:

find . -name '*.pyc' -delete

3

Tôi nhận được thông báo lỗi này vì tôi chạy nosetestslệnh từ sai thư mục.

Ngớ ngẩn, nhưng xảy ra.


Bạn có thể vui lòng thêm một số chi tiết cho câu trả lời của bạn? Bạn đã chạy nó từ thư mục nào? Tại sao nó sai? Thư mục phù hợp sẽ là gì? Chạy noseteststrong một thư mục không có thử nghiệm nào cả sẽ dẫn đến Ran 0 tests, không phải bất kỳ lỗi nhập nào. Ở dạng hiện tại, câu trả lời này không hữu ích.
gerrit 19/02/19

2

Tôi vừa gặp phải một điều nữa có thể gây ra vấn đề này: đặt tên cho các bài kiểm tra trong biểu mẫu testname.test.py. Điều đó bổ sung .gây khó hiểu và dẫn đến việc nó nhập những thứ không nên. Tôi cho rằng có thể rõ ràng rằng việc sử dụng các quy ước đặt tên thử nghiệm độc đáo sẽ phá vỡ mọi thứ, nhưng tôi nghĩ nó có thể đáng chú ý.


2

Ví dụ, với cấu trúc thư mục sau đây, nếu bạn muốn chạy noseteststrong m1, m2hoặc m3để kiểm tra một số chức năng trong n.py, bạn nên sử dụng from m2.m3 import ntrong test.py.

m1
└── m2
    ├── __init__.py
    └── m3
        ├── __init__.py
        ├── n.py
        └── test
            └── test.py

1

Chỉ để hoàn thành câu hỏi: Nếu bạn đang gặp khó khăn với cấu trúc như thế này:

project
├── m1
    ├── __init__.py
    ├── foo1.py
    └──m2
       ├── __init__.py
       └── foo2.py

└── test
     ├── __init__.py
     └── test.py

Và có thể bạn muốn chạy thử nghiệm từ một đường dẫn bên ngoài dự án, bao gồm đường dẫn dự án của bạn bên trong PYTHONPATH của bạn.

export PYTHONPATH=$PYTHONPATH:$HOME/path/to/project

dán nó vào bên trong .profile của bạn. Nếu bạn đang ở trong môi trường ảo, hãy dán nó vào bên trong kích hoạt trong gốc venv của bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.