首先.. 如果我们正在讨论注入匿名代码的方法,这里有几个缺少的用例..
code.compile_command()
code.interact()
imp.load_compiled()
imp.load_dynamic()
imp.load_module()
__builtin__.compile()
loading C compiled shared objects? example: _socket?)
但是,真正的问题是,你的目标是什么——你是否试图强制执行某种安全措施?或者您只是对正在加载的内容感兴趣。
如果您对security感兴趣,通过 exec/execfile 导入的文件名是无关紧要的 - 您应该使用rexec,它提供以下内容:
该模块包含 RExec 类,它支持 r_eval()、r_execfile()、r_exec() 和 r_import() 方法,它们是标准 Python 函数 eval()、execfile() 以及 exec 和 import 语句的受限版本。在这个受限环境中执行的代码只能访问被认为是安全的模块和功能;您可以根据需要对 RExec 添加或删除功能进行子类化。
但是,如果这更像是一种学术追求..这里有一些愚蠢的方法,您可能可以更深入地挖掘..
示例脚本:
./deep.py
print ' >> level 1'
execfile('deeper.py')
print ' << level 1'
./deeper.py
print '\t >> level 2'
exec("import sys; sys.path.append('/tmp'); import deepest")
print '\t << level 2'
/tmp/deepest.py
print '\t\t >> level 3'
print '\t\t\t I can see the earths core.'
print '\t\t << level 3'
./codespy.py
import sys, os
def overseer(frame, event, arg):
print "loaded(%s)" % os.path.abspath(frame.f_code.co_filename)
sys.settrace(overseer)
execfile("deep.py")
sys.exit(0)
输出
loaded(/Users/synthesizerpatel/deep.py)
>> level 1
loaded(/Users/synthesizerpatel/deeper.py)
>> level 2
loaded(/Users/synthesizerpatel/<string>)
loaded(/tmp/deepest.py)
>> level 3
I can see the earths core.
<< level 3
<< level 2
<< level 1
当然,这是一种资源密集型的方法,您将跟踪所有代码.. 效率不高。但是,我认为这是一种新颖的方法,因为即使您深入巢穴,它也会继续工作。您不能覆盖“评估”。尽管您可以覆盖 execfile()。
请注意,这种方法仅涵盖 exec/execfile,而不是“导入”。对于更高级别的“模块”负载挂钩,您可以使用
sys.path_hooks(由 PyMOTW 提供)。
这就是我想不到的。