2013-12-19 14 views
8

私はこれを解決する方法を探していました。Pythonインポートモジュール、フォルダ構造

私はPythonのプロジェクトを持っており、これは私がしたいフォルダ構造です:

/project/main.py 
/project/src/models.py 
/project/test/tests.py 

私は、端末にtests.pyを実行することにより、テストを実行できるようにしたいです。 tests.pyはテストのために/ project/src /にモジュールをインポートします。まず、tests.pyに sys.path.insert(0, '..')を追加して解決しました。しかし、models.pyで使用されているパスは、testschesなどとの相対パスでなければなりませんでした。これは、main.pyから出現するとプログラムが実行されないことを意味します。

from ..src.models import *のようにモジュールをtests.pyにインポートするときに dotsと試みましたが、「非パッケージでの相対インポートを試みました」というエラーメッセージが表示されました。

models.pyからモジュールをインポートするには、何をtests.pyの先頭に置くべきですか?

+0

使用しているPythonのバージョンは? – jpmc26

+0

Pythonバージョン2.7.5 – user1121487

答えて

3

使用している構造は私が推奨するものではありませんが、私はPythonプロジェクトが通常どのように構造化されているかを包括的に知っています。彼らはパッケージとして扱わいる作るために/project/project/src__init__.pyファイルを置き、/project/test

1:私は、これはあなたが後にしている何だろうと考えています。

2)from __future__ import absolute_importを各Pythonファイルの先頭に置きます。

3)次に、相対的な輸入品を使用します。

test.py

from ..src import models 

main.py

from .src import models 

4)あなたは、異なるアプリケーションを起動する必要があります。それがスタート地点だ場合、私は間違いなくsrcmain.pyをかけることになり、私自身のプロジェクトのために

python -m project.main 

:あなたの現在のディレクトリが、プロジェクトこの方法を実行します(ファイルシステムのルートであるように見える)/projectの親であることを確認あなたのアプリケーションの。 tests.pysrcに入れるかもしれませんが、そうでない場合は、コードではなくコマンドラインでをテストランナーのPythonパスに追加します。

私は依然としてabsolute_importを使用します。私の経験では、最初にすることができますあなたのテストで.. srcディレクトリに

をごmain.pyを置くのPython 3に

+0

私はまだこれを取得しています:ValueError:非パッケージでの相対インポートを試みました。どこでも__init__.pyが得られました。 – user1121487

+0

@ user1121487うん。ただそれを実現しました。ごめんなさい。あなたがすでにそれを理解していない場合、私の編集はそれを修正する必要があります。 – jpmc26

+0

同じエラーメッセージが表示されます。 – user1121487

0

それは組織をモジュールに非常にきれいな解決策だし、それは物事がデフォルトでどのように動作するかもですdo、sys.path。あなたは私はあなたのプログラムがで実行されますthiswayあなたは

import os 
os.chdir('relative path to the src dir') 

を追加することをお勧めアプリを実行している場所から関係なく、特定のディレクトリにあると実行を強制したい場合は(「srcディレクトリ」)

を追加あなたのコードにある相対パスを尊重するように指定したディレクトリ

関連する問題