web-dev-qa-db-ja.com

Python] - ImportError:既知の親パッケージなしで相対インポートを試みました。

私のプロジェクトの輸入に問題があります。

私のディレクトリ構造は次のとおりです。

base_directory
  - examples
  - src
    - folder_1
      - __init__.py
      - file.py
    - folder_2
      - __init__.py
      - class1.py
      - class2.py
      - class3.py
      - class4.py
 _

file.py 私はしようとしています: from ..folder2.class1 import Class1それでは、エラーが発生します。

ImportError:既知の親パッケージのない相対インポートを試みました

folder2/__init__.py私はPythonでパッケージを作成するためのチュートリアルで見たことをしました:

from class1 import Class1

my_class_1 = Class1()
 _

これまでのところ、何も働いています。私は何をすべきか?私はPython 3.7.5)を使います

ありがとう。

3
Francisco

例では、folder_1とfolder_2は2つの別々のパッケージと一意のパッケージです。それらの間の相対的なインポートはありません。それを仕事にするために単一の外側のパッケージに置く

_base_directory
  - examples
  - src
      - mypackage
        - __init__.py
        - folder_1
          - __init__.py
          - file.py
                print("imported", __file__)
                from ..folder_2.class1 import Class1
                print("file.py found", Class1)
        - folder_2   
          - __init__.py
          - class1.py
                print("imported", __file__)
                class Class1:
                def __init__(self):
                    print("Created Class1 instance")
          - class2.py
          - class3.py 
          - class4.py
      - test.py
            import myproject.folder_1.file
_

実行Test.pyスクリプトを実行します

_~/tmp/base_directory/src$ python test.py
imported /home/td/tmp/base_directory/src/myproject/folder_1/file.py
imported /home/td/tmp/base_directory/src/myproject/folder_2/class1.py
file.py found <class 'myproject.folder_2.class1.Class1'>
_

ただし、 "-m"オプションを使用してモジュールを呼び出すことができる回避策があります。しかし、myprojectがpythonパスにある場合にのみ彼の専用の機能。私がそれを呼び出すときに私はMyProjectの親にいるのでここで動作します。

_~/tmp/base_directory/src$ python -m myproject.folder_1.file
imported /home/td/tmp/base_directory/src/myproject/folder_1/file.py
imported /home/td/tmp/base_directory/src/myproject/folder_2/class1.py
file.py found <class 'myproject.folder_2.class1.Class1'>
_
4
tdelaney