2017-03-25 1 views
0

다른 많은 사람들과 마찬가지로 "ImportError : No module named {module name}"오류를 반환하는 테스트에 문제가 있습니다. 이는 일반적으로 테스트가 테스트중인 코드와 다른 디렉토리에 있기 때문에 발생합니다. 수정은 __init__ 문이 폴더에 있는지, 테스트 된 모듈과 같은 폴더에 테스트가 있는지, 파이썬 경로를 수정하는 트릭을 포함합니다. 이러한 유형의 많은 많은 질문 중 하나의 예는 다음과 같습니다 PATH issue with pytest 'ImportError: No module named YadaYadaYada'일반적인 "ImportError : No Module Named"예외의 두 가지 새로운 (?) 변형

뭔가 아주 내 시스템에 PYTHONPATH에 엉망 결론에 도달하고있어, 때문에 :

  • 테스트는 지금 테스트중인 모듈과 함께 배치하더라도 작동하지 않습니다. 테스트중인 모듈과 동일한 폴더에있는 테스트 스크립트는 Python 실행 파일로 실행되고 실행되지 않는 한 실제로 가져오고 사용할 수 있습니다. 테스트 (예 : pytest)!

  • Kenneth Reitz의 Hitchhiker 's Guide to Python에서 보여준 OS 경로 수정과 GitHub에서 복제 한 패키지를 사용하는 것도 내 시스템에서 작동하지 않습니다!

처음 두 개의 총알 점을 보여주기 위해 여기 내 프로젝트의 디렉토리는 다음과 같습니다

pydnmr 
├── CHANGELOG.txt 
├── LICENSE.txt 
├── README.rst 
├── docs 
│   └── placeholder.txt 
├── pydnmr 
│   ├── __init__.py 
│   ├── dnmrmath.py 
│   ├── dnmrplot.py 
│   ├── main.py 
│   ├── plottools.py 
│   ├── test_dnmrmath.py 
│   └── test_plot.py 
├── requirements.txt 
├── setup.py 
└── tests # unused 
    ├── __init__.py 
    ├── context.py 
    └── test_plot.py 

내가 처음에 아무 소용, 테스트 폴더에 리츠의 방법을 사용하여 시도, 그래서 포기하고 테스트를 테스트 할 코드와 동일한 디렉토리로 이동했습니다 (dnmrplot.py 등). 테스트 파일은 명령 줄에서 파이썬 스크립트 (python test_plot.py)로 실행하면 모듈을 가져 와서 정상적으로 실행되지만 테스트 (pytest test_plot.py)로 실행하면 가져 오기 오류가 발생합니다. 여기

는 test_plot.py 코드입니다 :

import pytest 
# noinspection PyUnresolvedReferences 
import dnmrplot 


def test_dnmrplot_2spin_type(): 

    WINDNMR_DEFAULT = (165.00, 135.00, 1.50, 0.50, 0.50, 0.5000) 
    x, y = dnmrplot.dnmrplot_2spin(*WINDNMR_DEFAULT) 
    print('x ', type(x), "y", type(y)) 
    assert type(x) == "<class 'numpy.ndarray'>" 
    assert type(y) == "<class 'numpy.ndarray'>" 


if __name__ == "__main__": 
    import plottools as pt 

    WINDNMR_DEFAULTS = (165.00, 135.00, 1.50, 0.50, 0.50, 50.00) 
    spectrum = dnmrplot.dnmrplot_2spin(*WINDNMR_DEFAULTS) 
    pt.popplot(*spectrum) 

시험 모두, 그리고 __main__로 실행할 때 실행되는 코드는 동일한 dnmrplot 모듈 가져 오기를 필요로한다. Python 실행 파일로 코드를 실행하면 pytest가 가져 오기 오류를 발생시킵니다. 리츠의 해결 방법에 관해서는

는 :

그러나
import sys 
import os 
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) 

import sample 

, 그의 포함하는 시험 test_basic.py가 실제로 수행합니다 그는 (또한 위 내 테스트 디렉토리에 저에 의해 채택) 테스트 디렉토리에 context.py 파일을 추가합니다 가져 오기를 테스트하십시오.

from .context import sample 

import unittest 


class BasicTestSuite(unittest.TestCase): 
    """Basic test cases.""" 

    def test_absolute_truth_and_meaning(self): 
     assert True 

    # I Added the following to actually require accessing 'sample': 

    def test_sample_hmm(self): 
     response = sample.hmm() 
     assert response == 'hmmm...' 

if __name__ == '__main__': 
    # unittest.main() #Reitz' code 
    print(sample.hmm()) # my code 

을 하나 파이썬 스크립트로 실행할 때, 또는 테스트로,이 샘플 가져 오기 실패 : 다음을 통해

def test_sample_hmm(self): 
     response = sample.hmm() 
>  assert response == 'hmmm...' 
E  AssertionError: assert None == 'hmmm...' 

test_basic.py:18: AssertionError 
----------------------------- Captured stdout call ----------------------------- 
hmmm... 
====================== 1 failed, 1 passed in 0.06 seconds ====================== 
$ python test_basic.py 
Traceback (most recent call last): 
    File "test_basic.py", line 3, in <module> 
    from .context import sample 
SystemError: Parent module '' not loaded, cannot perform relative import 
$ cd .. 
$ python tests/test_basic.py 
Traceback (most recent call last): 
    File "tests/test_basic.py", line 3, in <module> 
    from .context import sample 
SystemError: Parent module '' not loaded, cannot perform relative import 

내가 해봤 실행 테스트는 않도록 나는 그것을 수정 테스트 파일 내부와 위의 명령 줄. 또한 IDE PyCharm 내에서 테스트를 실행 해 보았습니다. PyCharm을 사용하여 상위 pydnmr 폴더를 소스 루트로 설정하려고 시도했습니다. 나는 Reitz 해결 방법을 만지작 거리다. 내 프로젝트를 내 하드 드라이브의 완전히 다른 위치에 복제 해 보았습니다. 이 시점에서 나의 가설은 나의 Mac에서 Anaconda 설치를 사용하고 PyCharm을 사용하는 사이에 내 컴퓨터에 PYTHONPATH가 망가졌으며 엑소시스트가 필요하다는 것입니다.

아나콘다 설치 및 PyCharm이 설치된 OS X에서 Python 3.4를 사용하십시오.

내 수입 문제의 원인을 알아내는 데 큰 도움이 될 것입니다.

+0

:이 동작을 해결하기 위해 나타납니다 일정한 수입이 사용되는 경우, 파이썬 스크립트 프로그램으로 실행을하지만) 테스트가 실패하고, b)는 수입은 빨간색 플래그가 PyCharm에서 해결되지 않은 참조로 경고. 그러나 상대 (도트) 가져 오기가 사용되면 테스트가 작동하고 PyCharm이 오류를 발견하지 못하지만 파이썬 프로그램이 실행되지 않습니다! 예를 들어 test_plot.py에서'from .dnmrplot import dnmrplot_2spin'을 사용하고 이에 따라 참조를 변경하면 테스트 (명령 행 또는 PyCharm)가 성공하지만'python test_plot.py'는'SystemError : Parent module '을로드하지 않고 수행 할 수 없습니다 상대 수입 '. –

답변

0

문제의 근원은 모듈이 가져 오기 대 스크립트로 사용되는지 여부와 관련이있는 것으로 보입니다. 뭔가 발견 한

Relative imports in Python 3