実際に腰を据えて Python 3 を試したのは今回が初めてですが、どうやら惨めに失敗しているようです。次の 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
ため、動作するはずです。ryan
sys.path
代わりに実行してみましょうmain.py
:
$ python main.py
ryan.test
True
Absolute import failed
ここで、テストは「ryan」パッケージ内にあり、相対インポートを実行できます。import config
暗黙的な相対インポートは Python 3 では許可されていないため、失敗します。
これが役に立つことを願っています。
PS: Python 3 を使い続ける場合は、ファイルは不要になります__init__.py
。