ModuleNotFoundError
Python 3.8.x の実行
それぞれ詳細なテストを含むクラスと関数を含む python パッケージを作成しています。パッケージ内では、これらのビルディング ブロックを使用して、これらのファイルの先頭にある絶対インポートを使用してエンド ツー エンドの使用法と例を提供しようとしています (私のテストのように)。
プロジェクトの構造は次のとおりです。
.
├── __init__.py
├── setup.py
├── examples
│ ├── __init__.py
│ └── end_to_end_1.py
├── tests
│ ├── __init__.py
│ └── utils
│ ├── __init__.py
│ ├── test_useful_one.py
│ └── test_useful_two.py
└── utils
├── __init__.py
├── useful_one.py
└── useful_two.py
を使用してパッケージルートからすべてのテストを実行していますpython -m unittest tests/**/*.py
が、両方のテストファイルには、次utils
のような絶対パッケージのインポートが含まれています。
from utils.useful_one import UsefulClass
このアプローチは、テストの実行とUsefulClass
クラスのテスト ファイルへのインポートに成功しています。
examples/end_to_end_1.py
モジュール内で同じインポートステートメントを使用しようとし、(パッケージのルートから) ファイルを実行しようとすると、私の問題が発生します。
python examples/end_to_end_1.py
今、私は runtime を取得しますModuleNotFoundError: No module named 'utils'
。
Python言語のガイドラインに従おうとして、可能な場合は絶対インポートを使用しようとしていますが、役に立ちません。
__init__.py
ファイルがランタイムにパッケージを解決する場所を伝える方法を完全に誤解しています。node パッケージや ruby gem 内でいつも同じパターンを目にするので、このユースケースは異常ではないと思います。
その場しのぎの(一時的な)解決策
現時点では、これを解決するために絶対インポートの結果からのソリューションを ModuleNotFoundErrorに適用しました。これは機能しているにもかかわらず、リポジトリが公開されている場合はあまりスケーラブルではないようで、Python エコシステムにはこの問題の解決策があるように感じます。レイモンド・ヘッティンガーが言うように..
もっと良い方法があるはずです!