まず、匿名コードを挿入する方法について話している場合、ここではいくつかの使用例がありません。
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の追加または削除機能をサブクラス化できます。
ただし、これがより学術的な目的である場合は、少し掘り下げることができるかもしれない2つの間抜けなアプローチを次に示します。
スクリプトの例:
./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のみを対象としています。より高いレベルの「モジュール」ロードフックでは、sys.path_hooksを使用できる場合があります
(PyMOTWの厚意により提供)。
私が頭から離れているのはそれだけです。