web-dev-qa-db-ja.com

Pythonプロジェクトのディレクトリ構造/ pytestのトラブル

これは地球上で最も簡単な問題になるはずですが、大規模な検索といじくり回した後でも、ディレクトリ構造を構築し、pytestなどを正しく実行するための「正しい」方法を見つけることには、依然として大きな問題があります。

私がAppleというプログラムを持っているとしましょう。

_|- README.md
|- Apple
|   |-- __init__.py
|   |-- Apple.py
| - tests
|   |-- test_everything.py
_

Apple.pyにはいくつかの関数が含まれています。たとえば、1つのeat()を呼び出しましょう。また、_test_everything.py_ファイルには、assert eat()=="foobar"などのテストが含まれています。とても簡単ですが、次に楽しみが始まります:

  • Appleディレクトリ内の___init__.py_はどうですか...正しいですか?空ですか、何が必要ですか?
  • ルートディレクトリから_py.test_を呼び出すのがベストプラクティスですか?または_py.test tests_?
  • そのため、多くのプロジェクトではテストディレクトリに___init__.py_が含まれていますが、py.testのドキュメントではそれが明らかに間違っているとされています。なぜ神なのか
  • _test_everything.py_ファイルの先頭にあるもの:_import Apple_または_from Apple import *_?または完全に何か他のもの
  • 次に、eat()またはApple.eat()によって関数を呼び出しますか?
  • 一部の人はPythonで_os.path.dirname_を操作することを勧めています

これは簡単なはずですが、私は上記のすべての組み合わせを見てきました。毒素や他の無数のツールについてさえ話していません。しかし、わずかなエラーで、_ImportError: No module named 'Apple'_またはその他のファンキーなエラーがスローされます。

「正しい」方法は何ですか?アドバイスやgithubなどの既存のコードは、非常に異なる規則に従っています。中程度の経験のあるコーダーの場合、これははるかに簡単です。

37
Basti
  1. Appleディレクトリ内の___init__.py_はどうですか...正しいですか?空ですか、何が必要ですか?

はい正解。最も頻繁に空です。 _foo = 42_を入れた場合、後で_from Apple import foo_を実行できますが、_from Apple.apple import foo_を入れた場合は_Apple.py_を行う必要があります。便利に思えるかもしれませんが、慎重に使用してください。

  1. ルートディレクトリからpy.testを呼び出すのがベストプラクティスですか?またはpy.testテスト?

py.testは関係なくテストを見つけることができるはずですが、以下を参照してください。

  1. そのため、多くのプロジェクトではテストディレクトリに___init__.py_が含まれていますが、py.testのドキュメントではそれが明らかに間違っているとされています。なぜ神なのか

そのため、一般的なテスト機能を提供するテストでファイルをインポートできます。 py.testでは、_tests/conftest.py_という名前のファイルにフィクスチャを作成することでより適切に達成できます。

  1. Test_everything.pyファイルの先頭にあるもの:インポートAppleまたはfrom Apple import *?または完全に別の何か

_from Apple import Apple_

  1. 次に、eat()またはApple.eat()によって関数を呼び出しますか?

Apple.eat()

  1. いくつかは、Pythonでos.path.dirnameを操作することを勧めています

それは非常に壊れやすいようです。私はどちらかを提案します

(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

20
thebjorn

動作する例 here を用意しました。

packagemoduleAppleの両方に名前を付けると混乱する、おそらくそれが混乱の原因の1つでした。明白でない唯一の部分IMOは、適切なsetup.py distutilsパッケージを使用してPYTHONPATHパッケージをインストールしていない場合は、Appleを現在のディレクトリに設定する必要があることです。

4
Bruno Oliveira