1. ホーム
  2. python

pytestで正しくインポートする

2023-09-07 12:49:27

質問

Python 2.6でpytestを使うためのセットアップをしたところです。それは、"import"ステートメントの処理を除いて、今のところうまくいっています。私のプログラムが行うのと同じ方法でインポートに応答するpytestを得ることができないようです。

私のディレクトリ構造は次のとおりです。

src/
    main.py
    util.py
    test/
        test_util.py
    geom/
        vector.py
        region.py
        test/
            test_vector.py
            test_region.py

実行するために、私は python main.py を src/ から呼び出します。

main.pyで、vectorとregionの両方をインポートしています。

from geom.region import Region
from geom.vector import Vector

vector.pyで、regionをimportして

from geom.region import Region

これらはすべて、標準的な実行でコードを実行すると問題なく動作します。しかし、src/から "py.test" を呼び出すと、一貫して import エラーで終了してしまいます。


いくつかの問題と私の解決策の試み

私の最初の問題は、 "test/test_foo.py" を実行するとき、 py.test は "import foo.py" を直接できないことでした。私はこれを "imp" ツールを使うことによって解決しました。in "test_util.py"。

import imp
util = imp.load_source("util", "util.py")

これは多くのファイルに対して素晴らしい動作をします。また、pytest が "path/test/test_foo.py" を実行して "path/foo.py" をテストするとき、それは "path" ディレクトリに基づくことを暗示しているようです。

しかし、これは "test_vector.py" では失敗します。Pytest は vector モジュールを見つけてインポートできますが はできません。 のいずれかを見つけることができません。 vector のインポートを見つけることができません。以下のインポート("vector.py")は、pytestを使用した場合、両方とも失敗します。

from geom.region import *
from region import *

これらは両方とも、次のような形式のエラーを出します。

ImportError: No module named [geom.region / region]

この問題を解決するために次に何をすればいいのかわかりません。Pythonのimportの理解は限られています。

pytestを使用しているとき、importを処理する適切な方法は何ですか?


編集: 非常にやっかいな解決策

vector.py からimport文を変更しました。

from geom.region import Region

を単純に

from region import Region

これは、"vector.py"のディレクトリへの相対的なimportになります。

次に、"test/test_vector.py"で、"vector.py"のディレクトリを以下のようにパスに追加しています。

import sys, os
sys.path.append(os.path.realpath(os.path.dirname(__file__)+"/.."))

これにより、Pythonは "geom/test/test_vector.py"から "../region.py"を見つけることができるようになりました。

これは動作しますが、パスに大量の新しいディレクトリを追加しているため、非常に問題があるように思われます。私が探しているのは、次のいずれかです。

1) pytestと互換性のあるインポート戦略、または

2) pytestのオプションで、私のインポート戦略と互換性のあるもの。

ですから、私はこの質問をこれらの種類の答えのためにオープンにしています。

どのように解決するのですか?

インポート は、以下のディレクトリを検索してモジュールを探します。

  1. ホームディレクトリ を指定します。これはあなたのルートスクリプトのディレクトリです。pytestを実行しているとき、ホームディレクトリはpytestがインストールされている場所です(おそらく/usr/local/bin)。pytestの場所があなたのホームディレクトリを決定するため、srcディレクトリからそれを実行していることは関係ありません。それが、モジュールが見つからない理由です。
  2. PYTHONPATH . これは環境変数です。あなたのオペレーティングシステムのコマンドラインから設定できます。Linux/Unix システムでは、次のように実行することで設定できます。 export PYTHONPATH=/your/custom/path を実行します。 もしPythonにテストディレクトリからモジュールを見つけさせたかったら、この変数にsrcパスを含める必要があります。
  3. 標準ライブラリ というディレクトリがあります。これは、すべてのライブラリがインストールされているディレクトリです。
  4. より一般的でないオプションとして pth ファイルを使う方法もあります。

sys.path を組み合わせた結果です。 ホームディレクトリ , PYTHONPATH そして 標準ライブラリ ディレクトリの中にあります。あなたが行っている、修正する sys.パス は正しいです。私が定期的に行っていることです。を使ってみてはいかがでしょうか。 PYTHONPATH をいじくり回すのが嫌なら sys.path