まず..匿名コードを挿入する方法について話している場合、ここにいくつかのユースケースがありません..
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を使用する必要があります。
このモジュールには、r_eval()、r_execfile()、r_exec()、および r_import() メソッドをサポートする RExec クラスが含まれています。これらのメソッドは、標準 Python 関数 eval()、execfile()、および exec および import ステートメントの制限付きバージョンです。この制限された環境で実行されるコードは、安全と見なされるモジュールと関数にのみアクセスできます。必要に応じて RExec の追加または削除機能をサブクラス化できます。
ただし、これがより学術的な追求である場合は、もう少し深く掘り下げることができるいくつかの間抜けなアプローチを次に示します..
スクリプト例:
./深い.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 のみを対象とすることに注意してください。より高いレベルの「モジュール」ロード フックについては、 sys.path_hooksを使用できる場合があります
(PyMOTW の好意による書き込み)。
それが私の頭の上にあるすべてです。