On 07/08/2012 14:18, Roy Smith wrote:
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.
Maybe not directly applicable to what you're saying, but Brett Cannon ought to know something about the import mechanism. I believe he's been working on it on and off for several years. See http://docs.python.org/dev/whatsnew/3.3.html for a starter on the gory details.
-- Cheers. Mark Lawrence. -- http://mail.python.org/mailman/listinfo/python-list
