2017-09-04 16 views
2

はい、同様の質問がありますが、私の問題には答えません。私のディレクトリ構造は次のとおりです。すべての__init__.pyファイルは空白です。私は次のコードを持っている​​でPython3:トップレベルを超える相対インポート

Package/ 
    __init__.py 
    sub_package1/ 
      __init__.py 
      file1.py 
    sub_package2/ 
      __init__.py 
      file2.py 

from ..sub_package1 import file1 

を私は上記のエラーを取得し、

ValueError: attempted relative import beyond top-level package 

同様の輸入を行うscikit学習パッケージの数がありますし、それは彼らのために働く。エラーが発生した

コマンド:

  1. 作業ディレクトリ:Package/
  2. コマンド:python /path/to/Package/sub_package2/file2.py相対的な輸入の仕事は、あなたが、残念ながら、コードを呼び出す方法によって異なりますかどうかは、
+0

"whatコマンド"で例外が発生しましたか?エラーを発生させるコマンドが – MSeifert

+0

に追加されました。 –

+0

私がリンクした重複は別の例外ですが、同じ解決策(@ Jean-Paulが以下に答えたのと同じ解決策) –

答えて

4

[email protected]:/tmp$ mkdir Package Package/sub_package{1,2} 
[email protected]:/tmp$ touch Package/__init__.py Package/sub_package{1,2}/__init__.py 
[email protected]:/tmp$ touch Package/sub_package1/file1.py 
[email protected]:/tmp$ echo "from ..sub_package1 import file1" > Package/sub_package2/file2.py 
[email protected]:/tmp$ python Package/sub_package2/file2.py 
Traceback (most recent call last): 
    File "Package/sub_package2/file2.py", line 1, in <module> 
    from ..sub_package1 import file1 
ValueError: Attempted relative import in non-package 
[email protected]:/tmp$ python -m Package.sub_package2.file2 
[email protected]:/tmp$ 

あなたpython Package/sub_package2/file2.pyランタイムがPackage/sub_package2は、モジュールパスの一部であることを認識しません。あなたが作業しているモジュールがちょうどfile2だと考えています。したがって、..相対インポートを解釈することはできません。

python -m ...というフルパスを使用してモジュールをインポートすると(通常のインポートステートメントと同様に)、完全なインポートパスが認識され、相対インポートが正しく解釈されます。

+0

エラーが出ます(最上位を越えて): '' 'ValueError:相対インポートを試みました"non-package"ではなくトップレベルパッケージの '' 'を超えています –

+1

例外の特定のテキストが重要なのかどうかはわかりません。私が実証したものとは少し違うエラーが発生しているのは事実です。しかし、両方のエラーの根本的な原因は同じです。トップレベルのスクリプトであるかのように、サブパッケージを意図したソースファイルの使用。あなたがそれを避けるならば、あなたはこのクラスの誤りから安全です。 –

関連する問題