2011-11-17 7 views
6

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.

risposta

5

Non si dovrebbero mai importare i propri moduli nel formato import mymodule (importazioni relative). Invece si dovrebbe sempre usare import myproject.mymodule invece (importazioni assolute). Questo evita tutte le scontro sul nome.

+1

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 :) –