Python Nose 가져 오기 오류


121

코 테스트 프레임 워크 가 파일 구조의 테스트 스크립트 아래에있는 모듈을 인식 하도록 할 수없는 것 같습니다 . 문제를 보여주는 가장 간단한 예를 설정했습니다. 아래에서 설명하겠습니다.

패키지 파일 구조는 다음과 같습니다.

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

foo.py에는 다음이 포함됩니다.

def dumb_true():
    return True

tests / test_foo.py에는 다음이 포함됩니다.

import foo

def test_foo():
    assert foo.dumb_true()

init .py 파일이 비어 있습니다.

nosetests -vv주 디렉터리 (foo.py가있는 위치)에서 실행하면 다음 과 같은 결과가 나타납니다.

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)

tests / 디렉토리 내부에서 실행할 때 동일한 오류가 발생합니다. 내가 찾은 문서와 예제 에 따르면 nose는 모든 부모 패키지를 경로와 호출되는 디렉토리에 추가해야하지만 내 경우에는 이런 일이 발생하지 않는 것 같습니다.

Python 2.6.2로 Ubuntu 8.04를 실행하고 있습니다. 중요한 경우 수동으로 (setup_tools가 아닌) nose를 구축하고 설치했습니다.

답변:


226

당신은 __init__.py당신의 최상위 디렉토리에 있습니다. 그것은 그것을 패키지로 만듭니다. 제거하면 nosetests작동합니다.

당신이 그것을 제거하지 않으면, 당신은 변경해야 importimport dir.foo, dir디렉토리의 이름입니다.


7
알았습니다. 고맙습니다! 나는 투표를하고 싶지만 분명히 더 많은 평판이 필요합니다.
halfak 2010-06-18

4
걱정 마. StackOverflow에 오신 것을 환영합니다! 답변으로 문제가 해결되면 왼쪽의 녹색 확인 표시를 선택할 수 있습니다.
ire_and_curses 2010-06-18

2
@halfak : 질문에 대해 다른 찬성 투표를하세요. 당신도 (당신의 대답에), @ire.
Mark Rushakoff

1
알았다. 팁 주셔서 감사합니다 :)
halfak

5
나는 경우 테스트가 작동 상황이 초기화가 루트 디렉토리에 평을 - 그러나, 내가 필요로 하는 파일이 수 및 수입 모델 <MODEL_NAME>. 아직 찾을 수 없습니다. 테스트는 tests / 디렉토리 안에 있고 테스트 하려는 모델models / 디렉토리 안에 있습니다. 어떤 도움을 주시면 감사하겠습니다.
Kees Briggs

32

당신은 virtualenv에 있습니까? 제 경우 nosetests에 하나 /usr/bin/nosetests사용되었다 /usr/bin/python. virtualenv의 패키지는 확실히 시스템 경로에 있지 않습니다. 다음은이 문제를 해결했습니다.

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

2
또한 내. 감사합니다. 많은 시간을 절약했습니다.
jskulski

3
나를 위해 ( 적절한 결과를 제공 하면서) 시스템 1에 nosetests캐시되었습니다 . 나는 이것을 지우기 위해 이것을 사용 했습니다. bash/usr/local/binwhich nosetests
Raffi 2011

5
또한 내 virtualenv를 비활성화하고 활성화해야했습니다.
Bengt 2016

virtualenv를 활성화 할 때 PS1 = $ {PS1 :-} 설정에 문제가있었습니다 (설정되지 않은 변수에 대한 오류를 극복하기 위해). 이것을 제거하고 + u 설정으로 전환 한 후 더 이상 문제가 없었습니다.
Juuso Ohtonen

13

나중에이 질문을 찾는 사람들에게 : __init__.py내 tests 디렉토리에 파일 이 없으면 가져 오기 오류가 발생합니다 .

내 디렉토리 구조는 다음과 같습니다.

./tests/
  ./test_some_random_stuff.py

코 테스트를 실행 한 경우 :

nosetests -w tests

그것은 ImportError다른 모든 사람들이보고 있는 것을 줄 것입니다. 빈 __init__.py파일을 추가하면 정상적으로 작동합니다.

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

10

또 다른 잠재적 인 문제는 디렉토리 트리의 하이픈 / 대시로 나타납니다. 최근에 디렉토리 이름을 sub-dir에서 sub_dir.



1
@Aman, 변수 식별자와 파일 이름의 차이점을 알고 있습니까?
Nakilon

예 ... 저는 항상 FooTests.py와 비슷한 파일을 가지고 있는데 어떤 이유에서인지 그것을 좋아하지 않았습니다 ... 저는 Foo_Tests.py로 이름을 바꾸었고 작동했습니다 ... 약간 까다로운 것 같습니다.
Birdman

3

물론 가져올 모듈에 구문 오류가있는 경우이 문제가 발생합니다. 나에게 문제는 tests.py와 같은 디렉토리에 module / tests.bak.py와 같은 경로로 테스트 파일을 백업했을 때 문제가 발생했습니다. 또한 Django 앱에서 init 패키지 / 모듈 문제 를 처리하기 위해 다음을 실행하여 (bash / OSX 셸에서) init .pyc 파일이 주변에 있지 않은지 확인할 수 있습니다.

find . -name '*.pyc' -delete

3

nosetests잘못된 디렉토리에서 명령을 실행하기 때문에이 오류 메시지가 나타납니다 .

어리석지 만 일어난다.


답변에 세부 사항을 추가해 주시겠습니까? 어떤 디렉토리에서 실행 했습니까? 왜 잘못 되었나요? 올바른 디렉토리는 무엇입니까? nosetests테스트가 전혀없는 디렉토리에서 실행 Ran 0 tests하면 가져 오기 오류가 아닌이 발생합니다. 현재 형식에서이 답변은 유용하지 않습니다.
gerrit

2

이 문제를 일으킬 수있는 한 가지 더 : 테스트 이름을 형식으로 지정했습니다 testname.test.py. 그 여분은 .코를 혼란스럽게하고 그것을 가져 오지 말아야 할 것들을 가져 오게합니다. 틀에 얽매이지 않는 테스트 명명 규칙을 사용하면 문제가 발생한다는 것이 명백 할 수 있지만 주목할 가치가 있다고 생각했습니다.


2

예를 들어, 다음 디렉토리 구조와 함께, 당신은 실행하려는 경우 nosetestsm1, m2또는 m3에서 일부 기능 테스트 n.py, 당신은 사용해야 from m2.m3 import n에서을 test.py.

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

1

질문을 완료하기 위해 : 다음과 같은 구조로 어려움을 겪고있는 경우 :

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

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

프로젝트 외부의 경로에서 테스트를 실행하고 싶을 수도 있습니다. PYTHONPATH 안에 프로젝트 경로를 포함 시키십시오.

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

프로필 안에 붙여 넣으세요. 가상 환경에있는 경우 venv 루트의 활성화 안에 붙여 넣습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.