2

問題

この 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 テンプレートにはそれがありませんが、その中にファイルを作成してテスト フォルダーをパッケージにしようとしました。多くの場所で、テスト フォルダーをパッケージにすることはお勧めできませんが、その構造を提案する人もいます。それもうまくいきませんでした。

この一見非常に標準的な問題の解決策を徹底的に検索しました。リンクの一部は次のとおりです。

私の最後の試みは、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」も。

4

1 に答える 1