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

Reply via email to