pytestで正しくインポートする
質問
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のオプションで、私のインポート戦略と互換性のあるもの。
ですから、私はこの質問をこれらの種類の答えのためにオープンにしています。
どのように解決するのですか?
インポート は、以下のディレクトリを検索してモジュールを探します。
- は ホームディレクトリ を指定します。これはあなたのルートスクリプトのディレクトリです。pytestを実行しているとき、ホームディレクトリはpytestがインストールされている場所です(おそらく/usr/local/bin)。pytestの場所があなたのホームディレクトリを決定するため、srcディレクトリからそれを実行していることは関係ありません。それが、モジュールが見つからない理由です。
- PYTHONPATH . これは環境変数です。あなたのオペレーティングシステムのコマンドラインから設定できます。Linux/Unix システムでは、次のように実行することで設定できます。 export PYTHONPATH=/your/custom/path を実行します。 もしPythonにテストディレクトリからモジュールを見つけさせたかったら、この変数にsrcパスを含める必要があります。
- は 標準ライブラリ というディレクトリがあります。これは、すべてのライブラリがインストールされているディレクトリです。
- より一般的でないオプションとして pth ファイルを使う方法もあります。
sys.path を組み合わせた結果です。 ホームディレクトリ , PYTHONPATH そして 標準ライブラリ ディレクトリの中にあります。あなたが行っている、修正する sys.パス は正しいです。私が定期的に行っていることです。を使ってみてはいかがでしょうか。 PYTHONPATH をいじくり回すのが嫌なら sys.path
関連
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] ディレクトリのZIPアーカイブを作成する方法は?
-
[解決済み] pytestの実行中に作成された通常の印刷出力を見るにはどうすればよいですか?
-
[解決済み】典型的なテストディレクトリ構造でunittestを実行する
-
[解決済み】pytestのPATH問題 'ImportError: YadaYadaYadaという名前のモジュールがない'
-
[解決済み] py.testテストを実行するようにPyCharmを設定するにはどうすればよいですか?
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Python Logging でログメッセージが2回表示される件
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonモジュールとPythonパッケージの違いは何ですか?
-
[解決済み】pytestのPATH問題 'ImportError: YadaYadaYadaという名前のモジュールがない'
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複
-
[解決済み] Pythonモジュールの絶対的インポートと明示的相対的インポート