2016-03-24 11 views
1

私はいくつかのユニットテストを追加するために取り組んでいるPythonモジュールを持っています。ユニットテストから(相対パスを使用して)モジュールを参照できないのはなぜですか?

from .. import myproj 

を私がしようとすると、私が手にかかわらず、それを実行します。私は次のように親モジュールをインポートしようとしているtest_myproj.py

myproj\ 
    __init__.py 
    myproj.py 
    test\ 
     test_myproj.py 

プロジェクトのレイアウトは次のようになりますこれは:

Traceback (most recent call last): 
    File "C:\Projects\myproj\test\test_myproj.py", line 6, in <module> 
    from .. import myproj 
SystemError: Parent module '' not loaded, cannot perform relative import 

インターネット上のさまざまな情報は、これがうまくいくはずですo私は何が欠けていますか?

+0

関連する質問がありますか? http://stackoverflow.com/questions/16981921/relative-imports-in-python-3 – jamesc

答えて

2

testディレクトリをパッケージにする必要があります - testディレクトリに__init__.pyファイルを追加してください。この後、のファイルを__name__myproj.test.test_myprojにする必要があります。その結果、相対インポートパスはmyprojになります。 from .. import myprojfrom myproj import myprojと解釈されます。しかし、テストファイルを直接実行すると__name____main__に設定されるため、相対インポートは計算できません。これを修正するには、テストファイルを直接実行する代わりにインポートする必要があります。テストを実行するために実行する個別のファイル(例:testrunner.py)を作成し、テストモジュールをインポートします(test_myproj.pyなど)。これは明らかに相対インポート構文がないか、問題が繰り返されます。インポートによって、テストファイルが__name__の値で実行され、相対インポートを計算できます。示すように、例えば:

testrunner.pyを追加します。

testrunner.py 
myproj\ 
    __init__.py 
    myproj.py 
    test\ 
     __init__.py 
     test_myproj.py 

testrunner.py内容:

from myproj.test import test_myproj.py 

が使用してテストを実行します。

python C:\Projects\testrunner.py 

または

cd C:\Projects\ 
python testrunner.py 

この方法では、testrunner.pymyprojパッケージの両方を保持する別のディレクトリを追加することをお勧めします。

相対インポートの詳細については、the answer hereを参照してください。

ノートでは、この問題のためにofficial docsにあります:相対的な輸入は、現在のモジュールの名前に基づいていること

注意。メインモジュールの名前は常に "__main__"なので、Pythonアプリケーションのメインモジュールとして使用するモジュールは、常に絶対インポートを使用する必要があります。

+0

「myproj.test.test_myproj」の '' __name__'をどのように設定しますか? –

+0

あなたはそれを設定しません。それはPythonによって自動的に設定され、あなたはそれを読むことしかできません。私の答えの最後にコードを含めた例のリンクを見てください。チェックしたいモジュールに 'print(__ name __)'を追加して、実行時とインポート時に出力を見るだけで、自分で見ることができます。 – Nikita

+0

私はそれを読んだことがありますが、その答えは、ユニットテストをサブディレクトリとして持つことは不可能であるということです。彼らはmyprojに平行なレベルに座っていなければなりませんか? –

関連する問題