-2

私はこの基本的なプロジェクト構造を持っています

/components/__init__.py
/components/com_auth.py
/app.py 

いいえ!からいくつかの変数をインポートしapp.pyたいcom_auth

私はこのようにしようとしています

/components/__init__.py
/components/com_auth.py
/__init__.py
/app.py 

しかし、もちろん、うまくいきません。

はい、私はこのようにできることを知っています

/app.py
/app/__init__.py                   <<<< there i containg varible
/app/components/__init__.py
/app/components/parent.py
/app/components/__init__.py
/app/components/com_auth.py

しかし、どうすればそれなしでそれを行うことができますか?

4

4 に答える 4

4

簡単な答え: やらないでください! から知る必要のある値が何であれapp.py、それを関数の引数として で行うことすべてに渡してくださいcom_auth.py。それ以外のすべては、遅かれ早かれ循環依存関係に陥り、プログラムを台無しにするだけです。サブモジュールをできるだけ独立した状態に保つようにしてください。

于 2013-07-29T16:12:28.857 に答える
1

が にあることを確認する必要がありapp.pyますPYTHON PATH

直接実行するpython component/com_authと、上位ディレクトリが存在しないPYTHON PATH(現在のスクリプトのディレクトリのみがシステムに自動追加されるPYTHON PATH)ため、 などの上位モジュールapp.pyはインポートできません。

あなたの問題には2つの解決策があります。

素早く汚いもの(怠惰なときにまだ使用していますが、うまく機能します)、手動でに追加しますPYTHON PATH

import sys
import os

sys.path.append(os.path.dirname(os.path.realpath(__file__)))

ただし、適切な解決策は、プログラムのエントリ ポイントが常にトップ ディレクトリにあることを確認することです。意味com_authは直接実行するべきではありませんが、常にモジュールからモジュールからモジュールから...ルートからインポートされます。そして、コードを実行してpython point_of_entry.pyand neverを実行しますpython sub_module/any_other_module.py。あなたの場合、おそらくapp.py.

それが不可能または望ましくない場合 (管理コマンド、単体テストなど)、ディレクトリを PYTHON PATH に追加するオプションを備えたスクリプトが必要です (これは、django-admin、nosetest などが行うことです)。

モジュールをテストしているだけで、すぐに実行したいだけだと思います。その場合は、次のように入力します。

PYTHONPATH='/path/to/your/project'

シェルで、現在のセッションの PYTHON PATH に追加されます。

後でアーキテクチャを修正できます。

于 2013-07-29T16:22:14.533 に答える