2011-11-17 4 views
6

私のDjangoプロジェクトでは、profileというアプリケーションがあります。Userオブジェクトの詳細については、profile.models.UserProfileクラスが含まれています(Djangoの人にはよく知られているようです)。今では、初期化コードをprofile/__init__.py(いくつかの信号)に入れて、問題が発生しました.Djangoはhotshot_profileというテーブルが見つからないことを伝えています。Pythonのモジュールシステム内で命名の衝突を避けるにはどうすればよいですか?

文字通り数時間の検索の後、私は問題をインポート順に追跡しました。 python -v manage.py testを実行すると、私は次を見つけた:

import nose.plugins.prof # precompiled from /home/rassie/.virtualenvs/myproject/lib/python2.6/site-packages/nose/plugins/prof.pyc 
import hotshot # directory /usr/lib64/python2.6/hotshot 
import hotshot # precompiled from /usr/lib64/python2.6/hotshot/__init__.pyc 
dlopen("/home/rassie/.virtualenvs/myproject/lib64/python2.6/lib-dynload/_hotshot.so", 2); 
import _hotshot # dynamically loaded from /home/rassie/.virtualenvs/myproject/lib64/python2.6/lib-dynload/_hotshot.so 
import hotshot.stats # from /usr/lib64/python2.6/hotshot/stats.py 
import profile # directory /home/rassie/MyProject/apps/profile 
import profile # precompiled from /home/rassie/MyProject/apps/profile/__init__.pyc 

だから私の鼻のランナーがnose.plugins.profをインポートします(このプラグインがオフになっていても)、profileをインポートしようとする輸入hotshotを、。しかし、profile私のプロジェクトからインポートされますが、システムPythonからインポートする必要があります。

明らかに、私自身のprofileモジュールは、システムprofileモジュールと衝突します。 Pythonにバンドルされているすべてのモジュール名を自分のプログラミングから除外することはできません。だから質問はどこから行くのですか?すべてのアプリケーションにmyproject名前空間を作成する必要がありますか? Djangoはこれで動作しますか?

PS:テーブルの名前hotshot_profileは、Profileクラスのpybbクラスからさらに詳細には完全に分析されたネーミングクラッシュから来ているようです。これは私のプロジェクトでも使用しています。しかし、それはこの問題の範囲外です。

答えて

5

自分のモジュールを決してimport mymodule(相対インポート)の形式でインポートしないでください。代わりに、常にimport myproject.mymodule(絶対インポート)を使用する必要があります。これにより、すべての名前の衝突が回避されます。

+1

私はいつも私が見つけることができるDjangoのすべてのアドバイスに従って絶対的な輸入を使用したと思った。私のアプリケーションをネームスペースに入れてから、グローバルパスに入れて、あなたが言うようにそれらをインポートする必要があるようです。それがうまくいくかどうかがわかります:) –

関連する問題