首先..如果我们正在讨论注入匿名代码的方法,这里有一对夫妇丢失了用例。
code.compile_command() code.interact() imp.load_compiled() imp.load_dynamic() imp.load_module() __builtin__.compile() loading C compiled shared objects? example: _socket?)
但是,真正的问题是,你的目标是什么 – 你是否试图强制某种安全? 或者你只是在什么被加载感兴趣。
如果您对安全性感兴趣,那么通过exec / execfile导入的文件名是无关紧要的 – 您应该使用rexec ,它提供了以下内容:
该模块包含RExec类,它支持r_eval(),r_execfile(),r_exec()和r_import()方法,它们是标准Python函数eval(),execfile()和exec和import语句的受限版本。 在这个受限制的环境中执行的代码只能访问被视为安全的模块和函数。 您可以根据需要inheritanceRExec的添加或删除function。
然而,如果这更多的是一个学术的追求..这里有一些愚蠢的方法,你可能会深入挖掘一点。
示例脚本:
./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/) loaded(/tmp/deepest.py) >> level 3 I can see the earths core. << level 3 << level 2 << level 1
当然,这是一个资源密集的方式来做到这一点,你会跟踪所有的代码..不是很有效率。 但是,我认为这是一种新颖的方法,因为即使你深入巢穴,它也能继续工作。 你不能重写'eval'。 虽然你可以覆盖execfile()。
请注意,这种方法只包含exec / execfile,而不是“导入”。 对于更高级别的“模块”负载挂钩,您可以使用sys.path_hooks (PyMOTW提供)。
这就是我所有的头脑。