2016-02-03 6 views
11

私はPythonのインポートシステムを使い、よりうまく動作するかどうかを理解していましたが、別の問題が発生しました。ValueError:トップレベルパッケージを越えて相対インポートを試みました

:今、私は次のエラーが表示され

import subpkg.a 

を:

from . import b 
from .. import d 

そしてc.pyの内側に、私は次のようしている:私は、私は次のコードを持っているa.py内側次の構造

pkg/ 
    __init__.py 
    c.py 
    d.py 

    subpkg/ 
     __init__.py 
     a.py 
     b.py 

を持っています

ValueError: attempted relative import beyond top-level package

しかしなぜ?どうすれば解決できますか?私はIDLEからc.pyを実行しており、pkg__init__.pyというファイルを持っているので、パッケージと見なすべきです。

最初のインポートが正常に動作しますが、それは動作しません。次のです:いくつかの奇妙な理由で、私は親パッケージから何かをインポートしようとしていますが、どうやら私はできませんので

from .. import d 

答えて

1

Python 3はインポートシステムを変更しました。作業しているモジュールの周りにモジュールが必要な場合は、PYTHON_PATHまたはsys.pathで混乱しない限り、相対インポートが必要です。

ここで正しい使い方はあなたがIDLEで作業しているとき、あなたは全く異なる環境を持つ

​​

でなければなりません。したがって、インポートが再び機能するように、現在の場所をパスに追加することができます。

試してみてください。

sys.path.insert(0, '') 

それは奇妙かもしれないが、それは大きな良い

PSに関するものです。この最後のものが動作しない場合は - 私は今IDLE環境を持っていません - おそらく、作業ディレクトリが正しく設定されていないためです。

は、代わりにこの答えを試してみてください:https://stackoverflow.com/a/17361545/754991

+0

を私が行う場合は '私が受け取る.subpkgインポートA'から:'はSystemError:親モジュール「」ロードされていないが、IDLEからと端末からの相対import'を実行することはできません。.. 。 – nbro

+0

@nbroこれはあなたがIDLEの中にいるためですが、モジュールの中で実行すると、インポートはそのようになります。 IDLEはひどいIDEで一般的なPython開発には悪いです。 IDLEモジュールと内部モジュールの両方で最適なオプションは、 'sys.path'に' pkg'ディレクトリを追加した後、 'pkg import subpkg.a'から完全なパッケージ名を使用することです。 – JBernardo

+0

どういう意味ですか?それをモジュールの中で実行しますか?私は、あなたが提案したように、ターミナルとIDLEの両方からファイル 'c.py'を(主として)実行すると、私は上記のエラーを私に与えます。 IDLEはひどいIDEですが、それはPythonに付属していますか?ひどいIDEを運ぶ目的は何でしょうか? IDLEは、確かに最高のものではない単純なIDEですが、理論的にはPythonでうまくいくはずです。それ以外の場合は意味がありません。 – nbro

関連する問題