Nel mio progetto Django ho un'app chiamata profile
, che per lo più contiene la mia classe profile.models.UserProfile
per ulteriori informazioni sugli oggetti User
(potrebbe sembrare familiare alla gente di Django). Ora ho inserito il codice di inizializzazione in profile/__init__.py
(alcuni segnali) e ho riscontrato un problema: Django mi ha detto che non è stato trovato un tavolo chiamato hotshot_profile
.Come evitare di denominare le collisioni all'interno del sistema dei moduli di Python?
Dopo letteralmente ore di ricerca, ho ricondotto il problema all'ordine di importazione. Esecuzione python -v manage.py test
ho trovato il seguente:
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
Quindi il mio corridore Naso importa il nose.plugins.prof
(anche se questo plugin è spento), le importazioni hotshot
, che cerca di importare profile
. Tuttavia, profile
viene importato da il mio progetto, mentre dovrebbe essere stato importato dal sistema Python.
Ovviamente, il mio modulo profile
è in conflitto con il sistema profile
modulo. Ovviamente non posso escludere ogni nome di modulo che viene fornito in bundle con Python dalla mia programmazione. Quindi la domanda è: dove vado da qui? Devo creare uno spazio dei nomi myproject
per tutte le mie app? Django lavorerà con quello?
PS: il nome di Table hotshot_profile
sembra provenire da uno scontro di denominazione ulteriormente ancora-a-essere-completamente analizzato con una classe Profile
da pybb
, che sto usando anche nel mio progetto. Ma questo è fuori dalla portata di questa domanda.
Ho sempre pensato di aver usato le importazioni assolute seguendo ogni consiglio su Django che ho trovato. Sembra che ho bisogno di mettere le mie app in un namespace e poi nel percorso globale e importarle come dici tu. Vedremo se va bene :) –