2012-02-14 5 views
16

マルチレベルの相対的な輸入マルチレベルの相対的な輸入

私はfoobar.pyモジュールutiltest.pyからアクセスしたいフォルダ構造

top\ 
    __init__.py 
    util\ 
     __init__.py 
     utiltest.py 
    foo\ 
     __init__.py 
     foo.py 
     bar\ 
     __init__.py 
     foobar.py 

を次のようしています。私は相対的な輸入以下しようとしたが、これは動作しません: from ...util.utiltest import *

私はいつもこのようmultileve相対インポートを行うにはどのように ValueError: Attempted relative import beyond toplevel package

を取得しますか?

+1

なぜ相対インポートですか? ); from:util.utiltest import * 'from util.utiltest import *'このオプションを使用すると、 –

答えて

12

あなたはtopの親フォルダからfoobarをインポートする必要があります。

import top.foo.bar.foobar 

これはtopは、トップレベルのパッケージであることのPythonを伝えます。相対輸入は、パッケージ内でのみ可能です。

11

私はこれが古い質問であることを認識していますが、受け入れられた答えが質問者のコードの主な問題を逃している可能性が高いと思います。厳密に言えば、間違っているわけではありませんが、実際の問題を偶然に遭遇するだけであることを示唆しています。

実際の問題は、top\foo\barfoobar.pyファイルがスクリプトとして実行されていることです。相対インポートが試行されると、Pythonインタプリタがパッケージ構造を理解していないので失敗します。

foobar.pyをファイル名で実行するのではなく、代わりにtop.foo.bar.foobarモジュールを実行するように、インタープリタに-mフラグを使用することです。こうすることで、Pythonは読み込んでいるメインモジュールがパッケージに入っていることを知り、相対インポートがどこを参照しているのかを正確に知ることができます。

関連する問題