2015-12-14 21 views
5

は、私は私のプロジェクトのためにこのような構造を持つようにしたい:Pythonの輸入構造

requirements.txt 
README.md 
.gitignore 
project/ 
    __init__.py 
    project.py 
    core/ 
     __init__.py 
     base.py 
    engines/ 
     __init__.py 
     engine1.py 
     engine2.py 
    utils/ 
     __init__.py 
     refine_data.py 
     whatever.py 

アプリケーションがproject/project.pyから実行されます。しかし、相対インポートまたは絶対インポートを使用すると、インポートエラーが発生します。

両方のエンジンがproject.core.baseからインポートする必要があり、utilsのは、同様にproject.core.baseからインポートする必要がある、とproject.py(メインファイルが走ったが)enginesからインポートできるようにする必要があります。

絶対輸入は動作しません:

エラーを与える
# engines/engine1.py 
from project.core.base import MyBaseClass 

ImportError: No module named project.core.base 

しかし、私が代わりに

# engines/engine1.py 
from ..core.base import MyBaseClass 

相対インポートを試みる場合、私は得る:

ValueError: Attempted relative import beyond toplevel package 

Githubの他のプロジェクトも同様に構造化されていますが、これはあらゆる問題を引き起こすようです。これをどのように機能させるには?

+1

兄弟パッケージはちょうど互いからインポートすることができるはずです。エンジンはただコアをインポートできます。 – pvg

答えて

2

てみこれらの輸入品を使用する:

engine1.py:

from core import base 

refine_data.py:

from core import base 

project.py

from engines import engine1 

pycharmマークプロジェクトのディレクトリをrootとしてソースとして使用し、project.pyを実行しようとすると、あなたがpycharmを使用しない場合は、プロジェクトディレクトリに移動し、コマンドを実行することによってproject.pyを実行することができます。

python project.py 
4

sys.pathをご覧ください。 projectディレクトリの上部がPythonパスにあり、サブパッケージ(つまりutilsenginesなど)が別のパッケージとして表示される可能性があります。そのため、インポートしようとしているエラーが発生しています相対インポートを行うときはパッケージの外にあり、絶対インポートは機能しません。なぜなら、Pythonパスの下にないので、トッププロジェクトディレクトリを見つけることができないからです。

ディレクトリ上記のより上のプロジェクトディレクトリは、pythonパスに追加する必要があります。

Ex。

/path/is/here/project/core/... 

# Add this to the PYTHONPATH 
/path/is/here 
+0

スクリプト内で 'sys.path.append()'を実行するだけでいいですか? –

+0

あなたは確かにそれを行うことができます。あなたのパッケージは配布されインストールされているのですか?もしそうなら、パッケージの 'setup.py'スクリプトを作成してインストールして、pythonpathにあることを確認してください。 –

+0

私は' project/project.py'をコマンドラインから実行しようとしています。しかし、もし私がそれを配布すれば、私は 'setup.py'を作ります(私はGoogleにどのようにしなければならないか、私はそれをやる方法はわかりません)。 –