In my Django project I have an app called profile
, which mostly contains my profile.models.UserProfile
class for additional information on User
objects (may seem familiar to Django folks). Now I've put some initialization code into profile/__init__.py
(some signals) and have ran into a problem: Django tells me that a table called hotshot_profile
has not been found.
After literally hours of searching, I traced the problem back to importing order. Running python -v manage.py test
I've found the following:
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
So my Nose runner imports the nose.plugins.prof
(even though this plugin is off), imports hotshot
, which tries to import profile
. However, profile
gets imported from my project, while it ready should have been imported from system Python.
Obviously, my own profile
module clashes with system profile
module. I obviously can't exclude every module name that comes bundled with Python from my own programming. So the question is, where do I go from here? Do I have to create a myproject
namespace for all of my apps? Will Django work with that?
PS: Table's name hotshot_profile
seems to come from a further yet-to-be-fully-analyzed naming clash with a Profile
class from pybb
, which I'm also using in my project. But that's out of this question's scope.
Package and Module Names Modules should have short, all-lowercase names. Underscores can be used in the module name if it improves readability. Python packages should also have short, all-lowercase names, although the use of underscores is discouraged.
Name clashes can occur, for example, if two or more Python modules contain identifiers with the same name and are imported into the same program, as shown below: In this example, module1 and module2 are imported into the same program. Each module contains an identifier named double, which return very different results.
The fullName of a modulefile is complete name which is made of two parts: sn and version. The sn is the shortname and represents the minumum name that can be used to specify a module. So for the gcc/7.1 modulefile. The fullName is gcc/7.1 and the sn is gcc and the version is 7.1 .
You should never import your own modules in the form import mymodule
(relative imports). Instead you should always use import myproject.mymodule
instead (absolute imports). This avoids all name clashes.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With