2016-10-29 9 views
2

私はpy.testを使用して私のpythonコードをテストしています。私のプロジェクトの関連する構造は、pytest integration - 正しくインポートする方法

-myproject 
    file.py 
    file2.py 
    -test/ 
     input.txt 
     input2.dat 
     test_part.py 
    -regress/ 
     file2_old.py 
     __init__.py 
     -test/ 
      test_file2_regression.py 

test_part.py輸入filefile2test_file2_regression.py輸入file2regress.file2_oldです。コンソールにpytestを実行すると、パッケージが存在しないというインポートエラーが発生します。一方、python -m pytestを実行すると、完全に正常に動作しますが、これはmyproject/ディレクトリから実行した場合のみです。

私のプロジェクトのどこからでも動作させるには、これを行う正しい方法は何ですか?私はすでにPYTHONPATHを修正しようとしましたが、私は正直なところ、それを正しく行う方法は考えていません。


詳しい情報:

私は、任意の設定ファイルを持っていない、と私__init__ sがちょうど空のファイルです。 PYTHONPATHを操作する必要がある場合は、複数のマシンで使用するため、myprojectに関連して行う必要があります。私はPython 2.7を実行しています。


私はすでにチェックアウト:

が、それは本当に私を助けていませんでした。

答えて

1

「これを実行する最善の方法」を検索する際に同じ問題と同様の成功を収めたため、可能な限り状況を回避するように結論づけましたが(結果的にトップレベルから実際のスクリプトを実行する) 、(パラレルフォルダからユニットテストのためのインスタンスのために)私の現在のアプローチは、これは、インタプリタは、スクリプトが開始された場所の上のフォルダに検索可能

from sys import argv, path 
from os.path import dirname, join 
path.append(join(dirname(argv[0]), "..")) 

です。別のアプローチ(argvを使用する代わりに)は、introspectモジュールを使用してファイル名を取得することです。後者が常に定義されているわけではないので、__file__を使用するよりもうまく動作します。

編集29.10: 代替argv[0]に私は、これはまたHow do I get the path of the current executed file in Python?を参照してください、少なくとも要求された目的のために働くことを願っています

from inspect import getsourcefile 
from sys import path 
from os.path import dirname, join 

this_file = getsourcefile(lambda _: None) 
path.append(join(dirname(this_file), "..")) 

を使用することです。

最も簡単な - それはあなたのケースで動作するかどうか - もちろんです:プロジェクト内の任意のディレクトリからpytestコマンドで動作します

from os.path import dirname, join 
path.append(join(dirname(__file__), "..")) 
+0

どのようにこれを正確に使用しますか? 'argv [0]'は 'pytest'のディレクトリを評価します。 'pytest'で呼び出された場合は、'/usr/local/bin/pytest'または 'python -m pytest'' '/ usr/local/lib/python2.7/dist-packages/pytest.py'を与えます。 – DerWeh

+0

本当に、私は前にそれを得ていませんでした。それで 'argv [0]'は本当にうまくいきません。 'inspect.getsourcefile()'を試してみてください(http://stackoverflow.com/questions/2632199/how-do-i-get-the-path-of-the-current-executed-file-in-pythonを参照してください)。 、ArtsOfWarfareからの回答です。) –

2

ソリューションはtest*.pyファイルにインポートする前に含めることです。 os.pardirの適切な数があるから__init__.pyファイルはモジュールをインポートすることができ、プロジェクトのディレクトリに移動するために使用される

import os 
from sys import path 
PATH = os.path.abspath(os.path.dirname(__file__)) 
path.append(os.path.join(PATH, os.pardir, os.pardir)) 

argv[0]inspect.getsourcefileの両方に必要な情報はありません。 argv[0]には、使用済みのpy.testモジュールの場所が含まれており、getsourcefileメソッドは単にNoneを返します。

関連する問題