相対インポート - ModuleNotFoundError: x という名前のモジュールがありません 質問する

相対インポート - ModuleNotFoundError: x という名前のモジュールがありません 質問する

実際に腰を据えて Python 3 を試したのは今回が初めてですが、どうやら惨めに失敗しているようです。次の 2 つのファイルがあります。

  1. テスト
  2. config.py

config.py には、いくつかの関数といくつかの変数が定義されています。私はこれを次のように削減しました。

config.py

debug = True

テスト

import config
print (config.debug)

私も__init__.py

ただし、次のエラーが発生します。

ModuleNotFoundError: No module named 'config'

私は、py3 の規則では絶対インポートを使用することを認識しています。

from . import config

ただし、これにより次のエラーが発生します。

ImportError: cannot import name 'config'

それで、ここで何をすべきか迷っています... どんな助けでも大歓迎です。 :)

ベストアンサー1

TL;DR:モジュールはパッケージの一部ではないため、実行するファイルから相対インポートを行うことはできません。__main__

絶対インポート- 利用可能なものをインポートするsys.path

相対インポート- 現在のモジュールに関連して何かをインポートします。パッケージの一部である必要があります。

両方のバージョンをまったく同じ方法で実行している場合は、どちらかが機能するはずです。ここでは、何が起こっているのかを理解するのに役立つ例を示します。main.py次のような全体的なディレクトリ構造を持つ別のファイルを追加してみましょう。

.
./main.py
./ryan/__init__.py
./ryan/config.py
./ryan/test.py

では、更新して何が起こっているか見てみましょうtest.py:

# config.py
debug = True
# test.py
print(__name__)

try:
    # Trying to find module in the parent package
    from . import config
    print(config.debug)
    del config
except ImportError:
    print('Relative import failed')

try:
    # Trying to find module on sys.path
    import config
    print(config.debug)
except ModuleNotFoundError:
    print('Absolute import failed')
# main.py
import ryan.test

まずは実行してみましょうtest.py:

$ python ryan/test.py
__main__
Relative import failed
True

ここで「test」はモジュールであり__main__、パッケージに属しているかどうかは何も知りません。ただし、フォルダーが に追加されるimport configため、動作するはずです。ryansys.path

代わりに実行してみましょうmain.py:

$ python main.py
ryan.test
True
Absolute import failed

ここで、テストは「ryan」パッケージ内にあり、相対インポートを実行できます。import config暗黙的な相対インポートは Python 3 では許可されていないため、失敗します。

これが役に立つことを願っています。

PS: Python 3 を使い続ける場合は、ファイルは不要になります__init__.py

おすすめ記事