Во-первых ... пара пропущенных вариантов использования здесь, если мы говорим о способах внедрения анонимного кода ..
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
Конечно, это ресурсоемкий способ сделать это, вы будете отслеживать
весь твой код .. не очень эффективный. Но я думаю, что это новый подход
так как он продолжает работать, даже если вы попадаете глубже в гнездо.
Вы не можете переопределить 'Eval'. Хотя вы можете переопределить execfile ().
Обратите внимание, что этот подход требует только exec / execfile, а не 'import'.
Для перехвата нагрузки «модуль» более высокого уровня вы можете использовать
sys.path_hooks (Автор любезности PyMOTW).
Это все, что у меня есть на макушке.