2012-08-29 1 views
8

저는 파이썬에 처음 접했고, 이제 조금 놀아 왔습니다. 나는 marshal와 함께 compile() 내장 함수와 함께 놀았고 exec()을 내장했다. 나는 대답을 찾지 못하는 것 몇 가지를 알아 챘다. 파일에 저장하고, marshal.dump()를 통해 연재 compile()를 통해 코드를 객체로 컴파일 할 때마샬링 된 코드 객체의 파이썬 exec()

with open('simple.py', 'r') as f: 
    code = f.read() 
exec code 

그러나, 다음 읽기 : 같은 것을 통해 실행할 때이 잘 작동

#!/usr/bin/python 

def foo(): 
    print "Inside foo()..." 

def main(): 
    print "This is a simple script that should count to 10." 

    for i in range(0, 10): 
     print "This is iteration number", i 

    foo() 

if __name__ == "__main__": 
    main() 

: 다음 스크립트를 고려 파일에서 marshal.load()을 통해 직렬화를 해제 한 후 exec()으로 실행하면 NameError이라는 오류 메시지가 표시되어 전역 이름 foo이 정의되지 않았습니다.

dir()의 결과를 보았습니다. import() 코드를 보면, foo()에 대한 정의가 있음을 알 수 있습니다. I은 또한 당신을 제공, exec 'import %s' % modname 같은 일을하고 dis.dis(sys.modules[modname])을하고 반대로 내가 볼 수있는 유일한 것은 (main()에 대한 LOAD_NAMECALL_FUNCTION, 내가이 역 직렬화 코드 객체에 dis.dis()를 사용하여 (marshal.load()를 통해 읽기) 것으로 나타났습니다 예상대로 전체 분해).

import()이 주소를 얻는 데 참조 할 수있는 조회 테이블이 있다고 정정합니까? (기록을 위해 나는 을 확인했고, py_compile.compile()을 통해 생성 된 바이트 코드와 compile()은 32 비트 타임 스탬프와 함께 imp.get_magic()이었다. 그러한 테이블이 존재한다면 그것을 참조 할 수있는 좋은 방법이 있습니까?

감사합니다.

+1

marshal.dump()를 통해 직렬화 될 때? 텍스트 파일? – Claudiu

+0

'compile()'을 통해 생성 된 스크립트의 코드 객체. – user1633448

+0

무슨 뜻인가요? 다음과 같이 작동합니다 : open ('simple.py', 'r') f : code = f.read() open ('simple.mash', 'w') with f : marshal.dump (코드 F) F와 같은 오픈 ('simple.mash', 'R')와 : 당신'marshal.dump 전에 코드 = marshal.load (F) 간부 코드 – Dhara

답변

0

이 스크립트는 simple.py 코드를 3 회 성공적으로 연습합니다. 이것은 무엇인가를 분명히합니까? 아니면 내가 당신의 질문을 오해하고 있습니까?

# from original example 
with open('simple.py', 'r') as f: 
    code = f.read() 
exec(code) 
# compile and run again 
a = compile(code, "simple_compiled_this_file_not_created", "exec") 
exec(a) 
# marshal and unmarshal 
import marshal 
f = open("./marshalfoo.bin", "wb") 
marshal.dump(a,f) 
f.close() 
b = marshal.load(open("./marshalfoo.bin", "rb")) 
exec(b) 
+1

흥미 롭습니다. 그래서 당신의 코드를 기반으로 내 문제를 추적 할 수있었습니다. 함수 내부에서 코드를'exec()'하려고하면'compile()'을 실행 한 후에'runme()'라는 함수를 호출하여 실제로 exec를 호출하는 것처럼 보일 것입니다() 결과 코드 개체에). 더 흥미로운 점은'exec()'을'compile()'과 같은 범위에서 호출하고'runme()'를 호출하면 잘 동작한다는 것입니다. 그래서 그것의 범위 문제. – user1633448

+1

신경 쓰이는 분이라면, 나는이 코드를 simple.py의 코드를 simple.py (간단한 코드라고 부름)에 넣고, if if____ == "__main __"''s = Simple()'와's.main()'을 사용한다. 그 후 코드는 모든 범위에서 올바르게 작동하는 것으로 보입니다. – user1633448