0

Pythonパッケージは、その中の任意のモジュールですべてを可能にするようにどのように構成されていると想定されていますか?

私のファイル構造は次のとおりです。

Project/
    |---log/
    |   |---some logs
    |
    |---src/
        |---foo/
        |   |---__init__.py
        |   |---analyse.py
        |   |---export.py
        |    
        |---bar/
        |   |---__init__.py
        |   |---log.py
        |   |---dbhandler.py
        |   
        |---__init__.py
        |---main.py

main.pyすべてを初期化します。foo/analyse.pyにインポートしたいのですbar/dbhandler.pyが、エラーが表示されるだけです。

AttributeError: 'module' object has no attribute 'analyse'

私はいくつかのステートメントを試しました:

import Project.src.foo.analyse
import src.foo.analyse
import foo.analyse
import analyse

それらはすべて同じエラーを出します。私も試しました:

from .. import foo.analyse
from .. import analyse

しかし、私は受け取りました:

ValueError: Attempted relative import beyond toplevel package

StackOverflowで約50のスレッドを調べ、インターネットで数え切れないほどの記事を読んだことがあります。私が見つけたすべてのことから、ファイルimport src.foo.*だけが各フォルダーにある場合、ステートメントはパッケージ内のどこからでも機能するはずです。__init__.py

誰かが同じ問題を抱えていましたか?

4

3 に答える 3

1

私はそれがすべきだと思います

from ..foo import analyse

それ自体が何..を意味するのかは不明なので、おそらく最上位のパッケージを指しているので、パッケージツリーの他のどのブランチを下に移動するかを指定する必要がありますfoo。この場合は。

それで、私はすることができます(提供さsrcれているのはあなたPYTHONPATHです。この場合、私はProjectディレクトリレベルで始めたばかりです):

>>> import src
>>> import src.bar
>>> import src.bar.dbhandler
>>> src.bar.dbhandler.analyse
<module 'src.foo.analyse' from 'src/foo/analyse.py'>
>>> src.bar.dbhandler.analyse.__file__
'src/foo/analyse.py'

また、お気づきかもしれませんが、現在の構造では、「メイン」パッケージはsrc、トップレベルが存在する場所であるため、と呼ばれ__init__.pyます。おそらくあなたが望むものではありません。

于 2012-09-18T09:40:04.980 に答える
1

ディレクトリ構造を考えると、main.pyには次のものが必要です。

import foo.analyse
import bar.dbhandler

そして、このように呼び出します(例):

foo.analyse.number_cruncher()
bar.dbhandler.db_store()

にあるディレクトリからプログラムを起動するmain.pyと、そのまま動作するはずです。それ以外の場合はPYTHONPATH、Nicola Musattiが提案するようにチェックするか、.pthファイルまたは多くのオプションのいずれかを使用する必要があります。

于 2012-09-18T09:44:31.713 に答える
0

PYTHONPATHに含まれていることを確認してProject/srcから、

import foo.analyse
于 2012-09-18T09:42:00.517 に答える