Generated code that is exec-ed (to simulate import) cannot import os.path??

From: Irmen de Jong (irmen_at_-NOSPAM-REMOVETHIS-xs4all.nl)
Date: 11/27/03


Date: Thu, 27 Nov 2003 21:59:25 +0100

Hello,
I don't understand why the following doesn't work.
What I want to do is dynamically import some generated
Python code and I'm doing this using compile and exec'ing
it in the dict of a new empty module object.
That works okay, but as soon as the generated code
tries do perform certain imports, it fails!
Certain other imports succeed. Consider this example code:

-----SNIP----
import imp

source="""
print 'importing random'
import random
print 'importing os'
import os
print 'bye!'

def getName():
     return 'Hello there'
"""

newmod = imp.new_module('generated.testmodule')
code=compile(source,'<generated code>','exec')
print 'got code...'
exec code in newmod.__dict__
print 'done, newmod.getname(): ',newmod.getName()
-----/SNIP----

When run, it produces the following output:

[E:\test]python dynimport.py
got code...
importing random
importing os
Traceback (most recent call last):
   File "dynimport.py", line 17, in ?
     exec code in newmod.__dict__
   File "<generated code>", line 5, in ?
   File "C:\Python23\lib\os.py", line 131, in ?
     from os.path import curdir, pardir, sep, pathsep, defpath, extsep, altsep
ImportError: No module named path

What's going on? Why can't it find os.path?

(Python 2.3.2, tested on linux and windows)

Confused,

Irmen.