Message from discussion I thought I understood how import worked...
Received: by 10.180.72.205 with SMTP id f13mr1180767wiv.4.1344849501739;
Mon, 13 Aug 2012 02:18:21 -0700 (PDT)
From: Roy Smith <r...@panix.com>
Subject: I thought I understood how import worked...
Date: Tue, 07 Aug 2012 09:18:26 -0400
Organization: PANIX Public Access Internet and UNIX, NYC
X-Trace: reader1.panix.com 1344345506 25328 127.0.0.1 (7 Aug 2012 13:18:26 GMT)
NNTP-Posting-Date: Tue, 7 Aug 2012 13:18:26 +0000 (UTC)
User-Agent: MT-NewsWatcher/3.5.3b3 (Intel Mac OS X)
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)
$ cat broken.py
$ cat try.py
for m in sys.modules.items():
And when I run try.py (with foo as the current directory):
$ PYTHONPATH=/home/roy/play/import python try.py
('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