これは地球上で最も簡単な問題になるはずですが、大規模な検索といじくり回した後でも、ディレクトリ構造を構築し、pytestなどを正しく実行するための「正しい」方法を見つけることには、依然として大きな問題があります。
私がAppleというプログラムを持っているとしましょう。
_|- README.md
|- Apple
| |-- __init__.py
| |-- Apple.py
| - tests
| |-- test_everything.py
_
Apple.pyにはいくつかの関数が含まれています。たとえば、1つのeat()
を呼び出しましょう。また、_test_everything.py
_ファイルには、assert eat()=="foobar"
などのテストが含まれています。とても簡単ですが、次に楽しみが始まります:
__init__.py
_はどうですか...正しいですか?空ですか、何が必要ですか?py.test
_を呼び出すのがベストプラクティスですか?または_py.test tests
_?__init__.py
_が含まれていますが、py.testのドキュメントではそれが明らかに間違っているとされています。なぜ神なのかtest_everything.py
_ファイルの先頭にあるもの:_import Apple
_または_from Apple import *
_?または完全に何か他のものeat()
またはApple.eat()
によって関数を呼び出しますか?os.path.dirname
_を操作することを勧めていますこれは簡単なはずですが、私は上記のすべての組み合わせを見てきました。毒素や他の無数のツールについてさえ話していません。しかし、わずかなエラーで、_ImportError: No module named 'Apple'
_またはその他のファンキーなエラーがスローされます。
「正しい」方法は何ですか?アドバイスやgithubなどの既存のコードは、非常に異なる規則に従っています。中程度の経験のあるコーダーの場合、これははるかに簡単です。
__init__.py
_はどうですか...正しいですか?空ですか、何が必要ですか?はい正解。最も頻繁に空です。 _foo = 42
_を入れた場合、後で_from Apple import foo
_を実行できますが、_from Apple.apple import foo
_を入れた場合は_Apple.py
_を行う必要があります。便利に思えるかもしれませんが、慎重に使用してください。
py.testは関係なくテストを見つけることができるはずですが、以下を参照してください。
__init__.py
_が含まれていますが、py.testのドキュメントではそれが明らかに間違っているとされています。なぜ神なのかそのため、一般的なテスト機能を提供するテストでファイルをインポートできます。 py.testでは、_tests/conftest.py
_という名前のファイルにフィクスチャを作成することでより適切に達成できます。
_from Apple import Apple
_
Apple.eat()
それは非常に壊れやすいようです。私はどちらかを提案します
(a)環境変数PYTHONPATHを設定して、_README.md
_以上のフォルダーを指すようにします
(b)setup.pyファイルを(_README.md
_ファイルと同じレベルで)作成します。これが最小限のものです。
_from setuptools import setup
setup(name='Apple', packages=['Apple'])
_
次のようにファイルを実行します。
_python setup.py develop
_
現在、Apple
は世界中で利用可能であり、_no module named Apple
_の問題は二度と発生しないはずです。つまり、ルートフォルダーまたはテストフォルダーからpy.testを実行できます。
_setup.py
_の詳細については、Pythonパッケージングユーザーガイド https://python-packaging-user-guide.readthedocs.org/en/latest/ index.html
動作する例 here を用意しました。
packageとmoduleApple
の両方に名前を付けると混乱する、おそらくそれが混乱の原因の1つでした。明白でない唯一の部分IMOは、適切なsetup.py
distutilsパッケージを使用してPYTHONPATH
パッケージをインストールしていない場合は、Apple
を現在のディレクトリに設定する必要があることです。