2012-02-03 11 views
11

可能性の重複は動作しません:
How to properly use relative or absolute imports in Python modules?pythonの相対的な輸入のコード例では、

この例のように、私は、このファイルのレイアウトを持っている: (ここからダウンロード:http://www.mediafire.com/?oug42nzvxrvoms4)を http://www.python.org/dev/peps/pep-0328/#guido-s-decision

moduleXは、以下を含みます。

from .moduleY import spam 
from .moduleY import spam as ham 
from . import moduleY 
from ..subpackage1 import moduleY 
from ..subpackage2.moduleZ import eggs 
from ..moduleA import foo 
from ...package import bar 
from ...sys import path 

、これは何が起こるかです:

C:\package\subpackage1>python moduleX.py 
Traceback (most recent call last): 
    File "moduleX.py", line 1, in <module> 
    from .moduleY import spam 
ValueError: Attempted relative import in non-package 

私のpython 2.7.2を持っています。私は

__init__.py 

すべてのディレクトリにファイルがあります。 このコードはなぜ機能しませんか?ドキュメントから

+4

このQ&Aは、このQ&Aの重複しているものよりも便利です。 – ArtOfWarfare

+0

ロボットの重複タガー;-) – nicorellius

答えて

20

あなたがこの見ることができます:

相対輸入はパッケージ階層におけるそのモジュールの位置を決定するために、モジュールの名前属性を使用します。モジュールの名前にパッケージ情報が含まれていない場合(たとえば、 'メイン'に設定されている場合)、相対インポートは、モジュールが実際にファイルシステム上のどこに配置されているかにかかわらず、モジュールがトップレベルモジュールであるかのように解決されます。

python moduleX.pyとして実行すると、まさに上記のとおりです。代わりに、これを試してみてください:

python -m package.subpackage1.moduleX 

これはmoduleXをインポートし、パッケージのトップレベルを配置します。 c:\から直接、あなたのケースで

package/ 
    __init__.py 
    subpackage1/ 
     __init__.py 
     moduleX.py 
     moduleY.py 
    subpackage2/ 
     __init__.py 
     moduleZ.py 
    moduleA.py 

すなわち:階層のトップから実行

c:\>python -m package.subpackage1.moduleX 

注一つのこと - moduleX.pyでの輸入はこれらです:

from .moduleY import spam 
from .moduleY import spam as ham 
from . import moduleY 
from ..subpackage1 import moduleY 
from ..subpackage2.moduleZ import eggs 
from ..moduleA import foo 
from ...package import bar 
from ...sys import path 

秒最後まで:

from ...package import bar 

には、ルートフォルダ(あなたの場合はc:\)がパッケージになる必要があります。 __init__.pyを有する)。また、それはpackage\__init__.pyで定義されているbar変数を必要としますが、現在そこにはありません(テストのためにそこにbar = 'bar!'を入れてください)。また、あなたは1レベルアップする必要があるので、packageフォルダを別のフォルダに入れて(c:\toppackage\packageで終わる)、c:\python -m toppackage.package.subpackage1.moduleXを実行する必要があります。上記PEP 328リンク内のノートがあります

from ...sys import path 

:この行のために

は、その最後のケースは合法的である一方で、それは確かに落胆していることを

(「非常識」でしたGuidoが使用した単語)。

も役立つかもしれない本について他のSOqsを参照してください。

これは役立ちます。

関連する問題