I've been tracking down some weird import problems we've been having with django. Our settings.py file is getting imported twice. It has some non-idempotent code in it, and we blow up on the second import.
I thought modules could not get imported twice. The first time they get imported, they're cached, and the second import just gets you a reference to the original. Playing around, however, I see that it's possible to import a module twice if you refer to it by different names. Here's a small-ish test case which demonstrates what I'm talking about (python 2.6.5): In directory /home/roy/play/import/foo, I've got: __init__.py (empty file) try.py broken.py $ cat broken.py print __file__ $ cat try.py import broken import foo.broken import sys for m in sys.modules.items(): if m[0].endswith('broken'): print m And when I run try.py (with foo as the current directory): $ PYTHONPATH=/home/roy/play/import python try.py /home/roy/play/import/foo/broken.pyc /home/roy/play/import/foo/broken.pyc ('broken', <module 'broken' from '/home/roy/play/import/foo/broken.pyc'>) ('foo.broken', <module 'foo.broken' from '/home/roy/play/import/foo/broken.pyc'>) So, it appears that you *can* import a module twice, if you refer to it by different names! This is surprising. It means that having non-idempotent code which is executed at import time is a Bad Thing. It also means that you could have multiple copies of a module's global namespace, depending on how your users imported the module. Which is kind of mind-blowing. -- http://mail.python.org/mailman/listinfo/python-list