먼저 익명의 코드를 삽입하는 방법에 대해 이야기하고 있다면 유스 케이스가 누락 된 것입니다.
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 를 사용해야 합니다. 다음을 제공합니다.
이 모듈에는 r_eval (), r_execfile (), r_exec () 및 r_import () 메소드를 지원하는 RExec 클래스가 포함되어 있습니다.이 메소드는 표준 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 / exec 파일에만 적용됩니다. 더 높은 수준의 '모듈'로드 후킹의 경우 sys.path_hooks 를 사용할 수 있습니다.
(PyMOTW의 쓰기 제공) .
그게 내가 머리 꼭대기에서 벗어난 전부입니다.