Por qué puedo llamar ‘imprimir’ desde ‘eval’

Para el código:

#!/usr/bin/python src = """ print '!!!' import os """ obj = compile(src, '', 'exec') eval(obj, {'__builtins__': False}) 

Me sale de salida

 !!! Traceback (most recent call last): File "./test.py", line 9, in  eval(obj, {'__builtins__': False}) File "", line 3, in  ImportError: __import__ not found 

Tanto ‘imprimir’ como ‘importar’ son construcciones de lenguaje. ¿Por qué ‘eval’ restringe el uso de ‘import’ pero no restringe ‘imprimir’?

PS estoy usando python 2.6

ACTUALIZACIÓN: La pregunta no es “¿Por qué no funciona la importación?” pero “¿Por qué funciona la impresión?” ¿Hay algunas restricciones de architecture o algo más?

El método __import__ es invocado por la palabra clave import : python.org

Si desea poder importar un módulo, debe dejar el método __import__ en los elementos integrados:

 src = """ print '!!!' import os """ obj = compile(src, '', 'exec') eval(obj, {'__builtins__': {'__import__':__builtins__.__import__}}) 

En su eval la llamada a import se realiza correctamente, sin embargo, la import hace uso del método __import__ en los elementos incorporados que usted no ha hecho disponible en su exec . Esta es la razón por la que estás viendo

 ImportError: __import__ not found 

print no depende de ningún elemento incorporado, así que funciona bien.

Podría pasar solo __import__ desde builtins con algo como:

 eval(obj, {'__builtins__' : {'__import__' :__builtins__.__import__}}) 

trabajos de impresión porque ha especificado 'exec' a la llamada a la función de compile .

import llama a la función global / __import__ ; Si no se encuentra uno, la import falla.

print no se basa en ningún global para hacer su trabajo. Es por eso que la print funciona en su ejemplo, aunque no use los __builtins__ disponibles.