問題
この cookiecutter テンプレートで作成されたので、Python パッケージの標準に従うプロジェクトのディレクトリ構造があります: https://github.com/audreyr/cookiecutter-pypackage#quickstart
ディレクトリ構造は
project_name
├── project_name
│ ├── __init__.py
│ └── module1.py
└── tests
└── test_module1.py
の最初のコード行test_module1.py
は次のとおりです。
from project_name import module1
しかし、私はModuleNotFoundError: No module named 'project_name'
.
私の理解では、呼び出されたフォルダーproject_name
はパッケージであり、__init__.py
ファイルの存在によって保証されるため、これは機能するはずです。
このようなインポートがどのように機能するかを理解するのにいつも苦労しました。私のプロジェクトでは、テストするモジュールと同じフォルダーにテストを配置することにいつも落ち着きました。これが悪い習慣であることはわかっていますが、モジュールを実際にインポートできる唯一の方法です。
私がすでに試したこと
__init__.py
親フォルダーと子フォルダーの両方の名前がproject_name
. これは機能しませんでした。同じエラーです。
__init.py__
また、Cookiecutter テンプレートにはそれがありませんが、その中にファイルを作成してテスト フォルダーをパッケージにしようとしました。多くの場所で、テスト フォルダーをパッケージにすることはお勧めできませんが、その構造を提案する人もいます。それもうまくいきませんでした。
この一見非常に標準的な問題の解決策を徹底的に検索しました。リンクの一部は次のとおりです。
- Python、テスト用のモジュールのインポート
- https://gist.github.com/tasdikrahman/2bdb3fb31136a3768fac
- 親フォルダーからのモジュールのインポート
- https://alex.dzyoba.com/blog/python-import/
- 兄弟パッケージのインポート
- ノーズを使用したテスト用の Python インポート - 現在のパッケージより上のモジュールをインポートするためのベスト プラクティスは何ですか
私の最後の試みは、Cookiecutter でプロジェクトを開始することでした。そのため、最初からすべてが適切にセットアップされます。しかし、私はまだModuleNotFoundError
.
欲しくないもの
sys.path
多くの回答が示唆しているように、私は変更したくありません。このような一般的な問題には、よりクリーンな方法が必要です。
私は何を間違っていますか?
いくつかの追加情報を編集します (@Nicholas からの質問を参照):
の内容は__init__.py
、
# -*- coding: utf-8 -*-
"""Top-level package for project_name."""
__author__ = """my_name"""
__email__ = 'my_email'
__version__ = '0.1.0'
これは Cookiecutter テンプレートによって生成されました。
の中で、発生するtest_module1
前に次を追加しました。ModuleNotFoundError
import sys
import os
print(sys.path)
print(os.getcwd())
sys.path
最初の要素がtests
ディレクトリであるリストを出力します。
['c:\\Users\\...\\project_name\\tests',
'C:\\Users\\...\\Miniconda3\\python37.zip',
'C:\\Users\\...\\Miniconda3\\DLLs', 'C:\\Users\\...\\Miniconda3\\lib',
'C:\\Users\\...\\Miniconda3',
'C:\\Users\\...\\Miniconda3\\lib\\site- packages',
'C:\\Users\\...\\Miniconda3\\lib\\site-packages\\win32',
'C:\\Users\\...\\Miniconda3\\lib\\site-packages\\win32\\lib',
'C:\\Users\\...\\Miniconda3\\lib\\site-packages\\Pythonwin']
最初の要素の小文字の「c」が重要かどうかはわかりません。
os.getcwd()
ルートディレクトリを出力し'c:\Users\....\project_name'
ます。小文字の「c」も。