65

これはさまざまな形で頻繁に尋ねられる質問であり、「あなたはそれを正しくやっていない笑」という回答を得ることがよくあります。それは、人々 (私を含む) が実装として使用しようとしている常識的なシナリオがあり、解決策が明らかではないためです (以前に行ったことがない場合)。

「ボトルから飛び出す」という答えを受け入れます。

与えられた

project/
    __init__.py
    /code
        __init__.py
        sut.py
    /tests
        __init__.py
        test_sut.py

tests_sut.py が始まる場所:

import code.sut

ルートディレクトリでノーズテストを実行すると、次のようになります。

ImportError: No module named code.sut

通った道:

a) を使用して相対を行う

from ..code import sut

b) プロジェクトのルートを PYTHONPATH に追加します

c) を使用する

sys.path.append

各テスト モジュールの開始時にインポートの前に .. パスを追加します。

d) することを忘れないでください

setup.py 

テストを実行する前に、プロジェクトでモジュールをサイト パッケージにインストールします。


したがって、要件は、プロジェクトにアクセスできるテスト パッケージ ルートの下にテストを配置することです。上記のそれぞれは、私には「自然」とは感じられず、問題があることが判明したか、あまりにも大変な作業のように思えます!

Javaではこれは機能しますが、基本的にビルドツール/ IDEの影響により、すべてのクラスがクラスパスに配置されます。おそらく問題は、Python からの「魔法」を期待していることですか? Flask webframework テストで指摘したように、オプション d) が優先されるようです。

いずれにせよ、好ましい解決策を推奨する以下のステートメントは、私自身の「不自然さ」の感覚を取り除くでしょう.

4

3 に答える 3

45

私は同じ問題を抱えていて、関連する質問の仕事で答えを見つけました。

プロジェクト ルートの __init__.py を削除するだけです。

于 2012-05-18T04:46:57.260 に答える
12

あなたはすでにあなたの質問にかなりよく答えています..D(システムの場所にインストール)は、配布可能なコードに適しています。何百ものカスタム ライブラリをシステム全体にインストールしたくないので、通常は C (sys.path を変更) を使用します。理論的には A (相対インポート) の方が良さそうですが、失敗する場合もあります。B (PYTHONPATH) は正しいです。私の意見では、実際にはテスト目的のみです。

これは、すべてのオプションをほぼまとめたものです。あなたが好むオプション (Python は魔法のようにどこを見ればよいかを知っています) は、実際には実行可能な解決策ではありません。関連のないプロジェクトから自動的にライブラリを見つけるなど、予測できない結果につながる可能性があるからです。

私の意見では、これをプログラムのエントリ ポイントに配置するのが最善の方法です。

import sys, os
sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path
于 2011-07-12T20:37:43.050 に答える
5

回答がチェックされていることは知っていますが、他の選択肢を共有するのは十分な理由だと思います:)

呼び出し中に設定するコントロールを提供するノーズパスマンジがあります。sys.pathnosestests

于 2013-09-18T06:00:41.523 に答える