2012-05-05 8 views
2

にインポートします。グローバル/アプリのlibフォルダには、私は(唯一のLIBSを示す)このような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フォルダからインポートできますか? views.pyのアプリケーションの一つ上のファイルアプリを内側から


from lib import global_stuff 

は.libファイルのインポートglobal_stuffから私に


ImportError: cannot import name global_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アイデア全体を変更したりすることはできません。

やコードの主要な部分を格納するために、他の良い方法はありますか?

+0

すべてのディレクトリに '__init __。py'があることを確認しましたか? PYTHONPATHに "/ path/to/project"を入れましたか? – rantanplan

+0

はい、すべてのディレクトリには__init__.pyがあり、sys.pathの最初のエントリはプロジェクトディレクトリです。 – xeor

答えて

4

あなたが輸入品で、プロジェクト名を関連付けるために望んでいないために適切であるので、このための一般的なパターンがあります:

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

とput /あなたのvirtualenvの上のあなたのパス内のパス/に/プロジェクト(あなたはvirtualenvを正しく使っていますか?)。

次にあなたが

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

あなたのコード内のEDITを行うことができます。これはもちろん、オープンソースとしてあなたのコードを公開していない場合にのみ最適です。D

+0

はい、virtualenvとherokuとあなたが指摘した構造。しかし、ディレクトリソースを呼び出す代わりに、私はそれをプロジェクト名そのものと呼んでいます。たぶん私は名前を変更する必要があります。 – xeor

+0

私の編集を読むことを願っています!コミュニティで公開する予定がある場合は、プロジェクト名を忠実に守ってください。あなたのプロジェクトをサードパーティーのアプリケーションとして持ち、 'ソースインポート時代から'をやっている人を想像してみてください。いいえ:) – rantanplan

+0

はい、私はそれを読んで、 "幸いにも"私はオープンソースプロジェクトとしてこれをリリースすることはできません。しかし、名前としての "source"は私には少し間違って見えますが、非常に便利です。 – xeor

3

私は実際に輸入

なぜないでプロジェクト名自体を使用して立ち往生することにしたいいけませんか?それが最善の方法です。 'パッケージ内輸入の相対輸入は非常にお勧めです。' - said in PEP-8としてください。

+0

プロジェクトの名前を変更しても、できるだけポータブルにしたいと思っています。その理由は、最後の手段としてインポートでプロジェクト名を使用することがわかっているからです。 – xeor

+2

@xeorアプリを移植したい場合は、プロジェクトのデータに頼ることはできません。 'global_stuff'をアプリケーションのフォルダに移動するか、' global_stuff'を別のアプリケーションにして 'requirements.txt'を追加してください。 – DrTyrsa

+0

コアアプリケーションが作成されました:)アイデアありがとう – xeor

関連する問題