2

私はこのようなDjango構造を持っています(ライブラリのみを表示しています):

project/lib/ # Global libraries that will be used cross apps
project/lib/global_stuff.py
project/apps/app1/lib/special_for_app1.py
project/apps/app2/lib/special_for_app2.py

一部のアプリにはlibフォルダーがありません。

from apps.app1.lib import special_for_app1正常に動作します。しかし、ローカルlibフォルダーが既に含まれているフォルダー内にいるときに、グローバルlibフォルダーからインポートするにはどうすればよいですか?

いずれかのアプリのappsviews.pyファイル内から:


from lib import global_stuff

私にくれImportError: cannot import name global_stuff


.libからimportglobal_stuff

私にくれImportError: cannot import name global_stuff


from ..lib import global_stuff

私にくれImportError: No module named lib


from ...lib import global_stuff

私にくれValueError: Attempted relative import beyond toplevel package


from project.lib import global_stuff

動作しますが、インポートでプロジェクト名自体を使用することに固執したくありません。


インポートでプロジェクト名を使用しない、またはlibのアイデア全体を変更することなく、これを解決する方法はありますか?

または、コードの主要部分を保存するための他の良い習慣はありますか?

4

2 に答える 2

4

プロジェクト名をインポートに関連付けたくないのは正しいので、これには一般的なパターンがあります。

project/
  |__/source/
  |     |__/lib/
  |     |__/app/
  |__/deployment/  # code for your production deployment maybe
  |
  |__/docs/   
  |__/tests/
  |__README
  |__requirements.txt

/path/to/project を virtualenv のパス内に配置します (virtualenv を使用していますか?)。

次に、コード内で行うことができます

from source.lib.blah import foo
from source.app.baz import bar

編集:もちろん、これはコードをオープンソースとしてリリースしない場合にのみ最適です。経営陣がプロジェクトの名前を変更し続ける内部プロジェクトがある場合のみ:D

于 2012-05-05T13:00:25.203 に答える
3

インポートでプロジェクト名自体を使用することに固執したくありません

なぜだめですか?それが最善の方法です。PEP-8 で述べられているように、「パッケージ内インポートの相対インポートは非​​常に推奨されない」ことに注意してください。

于 2012-05-05T12:23:41.900 に答える