For code:
#!/usr/bin/python
src = \"\"\"
print \'!!!\'
import os
\"\"\"
obj = compile(src, \'\', \'exec\')
eval(obj, {\'__builtins__\': False})
In your eval the call to import is made successfully however import makes use of the __import__ method in builtins which you have made unavailable in your exec. This is the reason why you are seeing
ImportError: __import__ not found
print doesn't depend on any builtins so works OK.
You could pass just __import__ from builtins with something like:
eval(obj, {'__builtins__' : {'__import__' :__builtins__.__import__}})