2016-07-28 17 views
2

これはかなり単純な問題であり、私は何か信じられないほど明白なものを見逃していると確信していますが、この苦境への答えは今や数時間にわたってわかりません。Python相対インポートでパッケージを見つけることができません

私のプロジェクトのディレクトリ構造は次のようになります。ここに私の命名規則とディレクトリ構造上の脇

-PhysicsMaterial 
    -Macros 
     __init__.py 
     Macros.py 
    -Modules 
     __init__.py 
     AvgAccel.py 
     AvgVelocity.py 
    -UnitTests 
     __init__.py 
     AvgAccelUnitTest.py 
     AvgVelocityUnitTest.py 
    __init__.py 

批判、私は相対的な輸入品を使用することができるように見えることはできません。

ValueError: Attempted relative import in non-package 

を私はセットアップ私ののinitファイルのすべてを持っているので:しかし、私は入れません

from .Modules import AvgAccel as accel 

:私は、相対インポートにAvgAccelUnitTest.pyでテストするモジュールのファイルをしようとしています私の構造全体に渡って、そして私もトップディレクトリを私のPYTHONPATHに追加しました、私は困惑しています。なぜPythonはパッケージを解釈せず、ファイルを正しくインポートしないのですか?

答えて

2

これは、スクリプトを__main__として実行しているために発生します。あなたはこのようなスクリプトを実行すると:

python /path/to/package/module.py 

そのファイルは__main__として、ないpackage.moduleとしてロードされ、それがパッケージの一部ではないので、それは相対的な輸入を行うことはできません。

これは、スクリプトで定義されたクラスが__main__.Class、もう一度package.module.Classとして2回定義されると、isinstanceのチェックが失敗したり同様の奇妙な結果になるという奇妙なエラーにつながります。このため、通常はモジュールを直接実行しないでください。

あなたのテストでは、testsディレクトリ内の__init__.pyを削除し、相対インポートの代わりにabsoluteを使用することができます。実際、あなたのテストはあなたのパッケージの中にあるべきではないでしょう。

また、テストをインポートして実行するテストランナースクリプトを作成することもできます。

+0

@ Brendan Abel情報をいただきありがとうございます。さらに調査をしたところ、全く同じ結論に達しました。最終的には、sys.path.appendを使用して絶対インポートを実行しました。ディレクトリ内でモジュールを再配置するつもりはないので、さらに気にする必要はありません。これは実際に私が必要とした関数デコレータを含む別のインポートの問題も解決します。 –

+0

他のモジュールがコマンドラインで実行しているのと同じモジュールをインポートしても、問題が発生する可能性があります。 –

+0

私はそれに来るときに私はその橋を渡るだろうと思う。私はそれまでにもっと良い解決策を用意しています。これは単なる趣味のプログラムであり、出荷する意図はほとんどないため、大丈夫になると思います –

関連する問題