2017-10-02 6 views
0
├── ledger 
│   ├── __init__.py 
│   ├── ledger_data.py 
│   └── ledger_model.py 
├── main.py 
├── sscommon 
│   ├── __init__.py 
│   └── logging.py 
└── tests 
    └── test_ledger_data.py 

から私はtest_ledger_data.pyを実行するときにledger_dataモジュールからクラスをインポートする必要があります。私は現在をtest_ledger_data.pyにするか、またはtestsディレクトリに使用されているすべてのモジュールにシンボリックリンクを追加する必要があります。どちらのオプションも正しくないようです。どのように正しく行うには?インポートPythonプロジェクト・モジュールのテストサブディレクトリ

私はどちらかのプロジェクトのルートまたは私はエラーを取得するtestsディレクトリからファイルを実行する場合:

from ledger.ledger_data import LedgerData 
ImportError: No module named 'ledger' 
+1

'tests /'フォルダ内に '__init __。py'ファイルを作成してそこに入力してください – Vinny

答えて

1

あなたのフォルダに__init__.pyファイルを作成し、使用して親ディレクトリをインポートすることができます。

parent_dir = os.path.abspath(os.path.join(os.path.abspath(__file__), os.pardir)) 
sys.append(parent_dir) 

これは、os.pathを使用して、ファイルの場所に基づいてディレクトリを検索します。


更新:上記__init__.py作成しtests/フォルダ内に存在します。 次に、test_ledge_data.pyにファイルfrom __init__ import *の先頭に置いてください。 initファイルのすべてをモジュールの名前空間にインポートします。

+0

テストをどのように使うのかを明確にしてください。 Python3 test_ledger_data.py'を直接実行すると(あなたのコードはインポート/実行されません)もし私がルートディレクトリにある新しいpythonファイルから実行すると、このコードがなくても動作します。 – VladimirLenin

+0

'sys.path.append(" ../ ")'より優れていますか?私はここで、それは良い習慣ではないことを読みました。 'tests.test_ledger_data import TestLedgerData'を実行するときに副作用がありませんか、結局私は他の場所から実行することに決めましたか? – VladimirLenin

+0

@VladimirLenin上記のコードは、親フォルダをインポートします。たとえ構造を他の場所に移動しても構造が保持されている限り、それは機能します。私の答えが役に立つと分かった場合は、upv​​otingと受け入れを検討してください。ありがとう – Vinny

関連する問題