2017-03-25 12 views
0

他の多くのユーザーと同様に、 "ImportError:No module named {module name}"というエラーを返すテストで問題が発生しました。テストはテスト対象のコードとは別のディレクトリにあるため、これは一般的です。修正には、__init__文がフォルダに存在すること、テストされたモジュールと同じフォルダにテストがあること、またはpythonパスを修正するためのトリックが含まれていることが含まれます。このタイプの多くの多くの質問のうちの一つの例は次のとおりです。テストが今ある一般的な "ImportError:No Module Named"例外の2つの珍しい(?)バリエーション

  • PATH issue with pytest 'ImportError: No module named YadaYadaYada'

    ので、私は、何かが非常に私のシステムでPYTHONPATHを台無しという結論に達していますテスト対象のモジュールと同じフォルダ内にあるテストスクリプトは、実際にPython実行可能ファイルとして実行され、実行されていない限り、実際にインポートして使用できます。テスト(例:pytest)で!

  • Kenneth ReitzのHitchhiker's Guide to Pythonが示したOSパスフィックスと、GitHubからクローン化されたsamplemodパッケージを使用すると、私のシステムでは動作しません!

最初の2の箇条書きを実証する:ここに私のプロジェクトのためのディレクトリは次のとおりです。

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 

私が最初に無駄に、テストフォルダにReitz氏のメソッドを使用してみましたので、私はあきらめ、テストをテストするコードと同じディレクトリに移動しました(dnmrplot.pyなど)。テストファイルは、コマンドラインからpythonスクリプト(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がインポートエラーを返します。

Reitz氏の回避策について:彼は(も上図の私のテストディレクトリの中で私が採択した)testsディレクトリ内context.pyファイルを追加します。

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

import sample 

をしかし、彼含まテストtest_basic.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 

とPythonスクリプトとして、またはテストのいずれかとして実行すると、それはサンプルのインポートに失敗:それがないように、私はそれを修正し

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が壊れていて、エクソシストが必要だということです。

AnacondaインストールとPyCharmを使用して、OS XでPython 3.4を使用する。

インポートに関する問題の原因を突き止めるための助けがあれば、大歓迎です。

+0

私が何かを発見した:正規輸入が使用されている場合、Pythonスクリプトがプログラムとして実行されますが、a)のテストが失敗、およびb)の輸入が赤でフラグが立てられているが未解決の参照としてPyCharmで警告します。相対(ドット)インポートが使用されている場合、テストは動作し、PyCharmはエラーを検出しませんが、Pythonプログラムは実行されません! test_plot.pyで 'from .dnmrplot import dnmrplot_2spin'を使用して参照を変更すると、テスト(コマンドラインまたはPyCharm)がパスしますが、' python test_plot.py'は 'SystemError:Parent module 'をロードせず、実行できません相対輸入 'となる。 –

答えて

0

問題の根本的な原因は、モジュールをインポートとして使用するのか、スクリプトとして使用するのかにあります。これは、行動に対処するために表示されます。

Relative imports in Python 3

関連する問題