Во-первых ... здесь отсутствует пара примеров использования, если мы говорим о способах внедрения анонимного кода ...
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. Код, выполняемый в этой ограниченной среде, будет иметь доступ только к модулям и функциям, которые считаются безопасными; вы можете создать подкласс 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).
Это все, что у меня в голове.
person
synthesizerpatel
schedule
04.06.2011
pathlib
решение Рона Калиана, если вы используете python 3.4 или выше: stackoverflow.com/a/48931294/1011724 - person Dan   schedule 22.08.2018python myfile.py
из оболочки оно работает, но и:!python %
, и:!python myfile.py
изнутри vim не работают с Система не может найти указанный путь. Это довольно раздражает. Может ли кто-нибудь прокомментировать причину этого и возможные обходные пути? - person inVader   schedule 27.11.2018