[Python-Dev] distutils.sys: None in sys.modules
M.-A. Lemburg
mal@lemburg.com
Tue, 10 Apr 2001 14:06:47 +0200
Ka-Ping Yee wrote:
>
> On Tue, 10 Apr 2001, M.-A. Lemburg wrote:
> > > What are 'distutils.sys', 'distutils.os', 'distutils.string',
> > > 'distutils.re', 'distutils.distutils' doing in there?
> > > (The sys.modules dictionary maps all these keys to None.)
> >
> > This basically means that the corresponding modules have already
> > been loaded at top-level.
>
> But there's no 'sys' module in the distutils package.
The None entry is used to cache the import miss. Please see
Python/import.c for details (function mark_miss).
> If there were one, it would be called 'distutils.sys'
> everywhere, even within the distutils package, since
> we decided that packages would always use absolute
> module paths, right?
>
> This behaviour seems quite confusing to me:
>
> localhost[1]% ls -al foo
> total 9
> drwxr-xr-x 2 ping users 1024 Apr 10 04:50 ./
> drwxr-xr-x 12 ping users 5120 Apr 10 04:49 ../
> -rw-r--r-- 1 ping users 0 Apr 10 04:49 __init__.py
> -rw-r--r-- 1 ping users 106 Apr 10 04:50 __init__.pyc
> -rw-r--r-- 1 ping users 50 Apr 10 04:50 sys.py
> -rw-r--r-- 1 ping users 216 Apr 10 04:50 sys.pyc
> localhost[2]% cat foo/sys.py
> import sys, os
>
> print 'here is foo.sys'
>
> blah = 1
> localhost[3]% python -S
> Python 2.1b2 (#28, Apr 10 2001, 02:49:05)
> [GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
> Type "copyright", "credits" or "license" for more information.
> >>> import sys, foo
> >>> sys.modules.keys()
> ['__main__', '__builtin__', 'sys', 'foo', 'signal', 'exceptions']
> >>> import foo.sys
> here is foo.sys
> >>> sys.modules.keys()
> ['os.path', 'os', 'foo', 'foo.sys', 'exceptions', '__main__', 'foo.os', 'posix', 'sys', '__builtin__', 'signal', 'UserDict', 'posixpath', 'stat']
> >>> sys.modules['foo.os']
> >>> sys.modules['foo.sys']
> <module 'foo.sys' from '/home/ping/python/foo/sys.py'>
> >>> import foo.os
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> ImportError: no module named 'os' could be found
> >>> import foo.sys
>
> At this point sys.modules['foo.sys'] is a real module, as it should
> be, but sys.modules['foo.os'] is None. I don't see why 'foo.os'
> should be present at all.
--
Marc-Andre Lemburg
______________________________________________________________________
Company & Consulting: http://www.egenix.com/
Python Pages: http://www.lemburg.com/python/