2016-08-21 13 views
3

をい私のアプリの構造である:絶対インポートが機能しない、しかし、相対インポートはここ

from foodo.models import User 

ImportErrorをスロー:

ImportError: No module named models 
models.pyモジュールから

foodo/ 
    setup.py 
    foodo/ 
     __init__.py 
     foodo.py 
     models.py 

foodo/foodo/foodo.py輸入クラスを

しかし、相対インポートを使用するとうまくいきます:

from models import User 

また、インポートする前にpdbブレークポイントを挿入して続行すると機能します。

絶対インポートと相対インポートの両方を正しく使用できるはずですか?

+0

どのように 'foodo/foodo/foodo.py'を実行していますか?ディレクトリを 'foodo/foodo /'に変更し、 'python foodo.py'を実行すると、あなたが記述した動作が得られます。代わりに、 'foodo /'にcdして 'python -m foodo.foodo'を実行すれば、すべてが意図どおりに動作するはずです。 (パッケージと内部のモジュール名が同じであるので、さらに '__future__ import absolute_imports'が必要かもしれません。) – Blckknght

+0

こんにちは、ありがとうございます。だから私の選択肢は、この輸入または相対輸入を使用することです? – LaSmell

+0

はい、内部のフードモジュールの名前を変更することで問題が解決され、絶対インポートを使用することもできます。 Thanks – LaSmell

答えて

6

foodooパッケージ内にローカルモジュールfoodooがあります。 Python 2でのインポートは、まず最上位の名前を探す前に、まず現在のパッケージ内の名前を探します。

どちらかfoodooパッケージ(ローカルfoodooが最初に発見されたという可能性を排除する)または使用の内側foodooモジュールの名前を変更:Pythonの-3スタイルを有効にするには、あなたのパッケージであなたのモジュールの上部に

from __future__ import absolute_import 

名前を接頭辞として.の接頭辞を付けない限り、トップレベルのモジュールだけが検索されます。詳細は、PEP 328 -- Imports: Multi-Line and Absolute/Relativeを参照してください。

+0

こんにちは、ありがとう、 私はfoodo/foodo/foodo.pyの名前をfoodo/foodo/main.pyに変更しましたが、無駄です。 また、すべての一意のパッケージ/モジュール名を持つダミーディレクトリを作成してテストしましたが、エラー – LaSmell

+0

@LaSmellもあります:a)すべての古くなった '.pyc'ファイルをクリアした、またはb)あなたは '.pyc'ファイルを持っていないことが保証されていますか?あなたの問題を正確に再現し、パッケージからインポートを行うことができる必要があるパッケージの*各モジュール*の 'from __future__ import absolute_imports'を使って修正することができます。 –

+0

はい私は(a)と(b)の両方をしました。私はここで間違ったことをしています。 。 。 __future__ちょうど明確にする私のテストパッケージ/モジュールのいずれか を上では動作しません、トップレベルのfoodo DIRが__init__を持っていない、foodoパッケージは、(/foodo/foodo/__init__.py) – LaSmell

関連する問題