私の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
クラスからさらに詳細には完全に分析されたネーミングクラッシュから来ているようです。これは私のプロジェクトでも使用しています。しかし、それはこの問題の範囲外です。
私はいつも私が見つけることができるDjangoのすべてのアドバイスに従って絶対的な輸入を使用したと思った。私のアプリケーションをネームスペースに入れてから、グローバルパスに入れて、あなたが言うようにそれらをインポートする必要があるようです。それがうまくいくかどうかがわかります:) –