2011-11-17 7 views
6

En mi proyecto Django tengo una aplicación llamada profile, que en su mayoría contiene mi clase profile.models.UserProfile para obtener información adicional sobre los objetos User (puede parecer familiar para la gente de Django). Ahora puse un código de inicialización en profile/__init__.py (algunas señales) y me encontré con un problema: Django me dice que no se ha encontrado una tabla llamada hotshot_profile.¿Cómo evito nombrar conflictos dentro del sistema de módulos de Python?

Después de literalmente horas de búsqueda, rastreé el problema hasta el orden de importación. Correr python -v manage.py test que he encontrado lo siguiente:

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 

Así que mi nariz importa el corredor nose.plugins.prof (aunque este plugin es apagado), las importaciones hotshot, que intenta importar profile. Sin embargo, profile se importa de mi proyecto, mientras que listo debería haberse importado del sistema Python.

Obviamente, mi propio módulo profile choca con el módulo del sistema profile. Obviamente no puedo excluir todos los nombres de módulos que viene incluido con Python de mi propia programación. Entonces la pregunta es, ¿a dónde voy desde aquí? ¿Debo crear un espacio de nombre myproject para todas mis aplicaciones? ¿Funcionará Django con eso?

PD: el nombre de la tabla hotshot_profile parece venir de un choque de nombres más todavía-a-ser-totalmente analizada con una clase de Profilepybb, las cuales yo también estoy usando en mi proyecto. Pero eso está fuera del alcance de esta pregunta.

Respuesta

5

Nunca debe importar sus propios módulos en el formato import mymodule (importaciones relativas). En su lugar, siempre debe usar import myproject.mymodule en su lugar (importaciones absolutas). Esto evita todos los conflictos de nombres.

+1

Siempre pensé que he usado importaciones absolutas siguiendo todos los consejos sobre Django que pude encontrar. Parece que necesito poner mis aplicaciones en un espacio de nombres y luego en una ruta global e importarlas como dices. Veremos si va bien :) –

Cuestiones relacionadas