2011-11-17 11 views
6

W moim projekcie Django mam aplikację o nazwie profile, która zawiera głównie moją klasę profile.models.UserProfile w celu uzyskania dodatkowych informacji na temat obiektów User (może wydawać się znajomym osobom Django). Teraz wprowadziłem kod inicjujący do profile/__init__.py (niektóre sygnały) i wystąpił problem: Django mówi mi, że nie znaleziono tabeli o nazwie hotshot_profile.Jak uniknąć konfliktów nazw w systemie modułów Pythona?

Po dosłownie kilku godzinach przeszukano problem z powrotem do zamówienia importowania. Uruchamianie python -v manage.py test Znalazłem następujące:

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 

Więc mój nos biegacz importuje nose.plugins.prof (choć ten plugin jest wyłączony), import hotshot, która stara się importować profile. Jednak profile zostanie zaimportowany z mojego projektu, natomiast powinien być zaimportowany z systemu Python.

Oczywiście, mój własny moduł profile koliduje z modułem systemu profile. Oczywiście nie mogę wykluczyć każdej nazwy modułu, która jest dołączona do Pythona z mojego własnego programowania. Pytanie brzmi: dokąd zmierzam? Czy muszę utworzyć przestrzeń nazw myproject dla wszystkich moich aplikacji? Czy Django będzie z tym pracował?

PS: nazwa tabeli za hotshot_profile wydaje się pochodzić z jeszcze dalej-do-pełni-analizowanym nazewnictwa starcia z Profile klasy z pybb, które Używam również w moim projekcie. Ale to nie dotyczy zakresu tego pytania.

Odpowiedz

5

Nigdy nie należy importować własnych modułów w postaci import mymodule (import względny). Zamiast tego należy zawsze używać wartości import myproject.mymodule (import bezwzględny). Pozwala to uniknąć wszystkich konfliktów nazw.

+1

Zawsze uważałem, że użyłem bezwzględnego importu, postępując zgodnie z każdą radą na temat Django, którą mogłem znaleźć. Wygląda na to, że muszę umieścić moje aplikacje w przestrzeni nazw, a następnie w globalnej ścieżce i zaimportować je zgodnie z twoją wolą. Zobaczymy, czy to pójdzie dobrze :) –