2010-05-13 3 views
2

'exec'로 실행하는 파이썬 스크립트가 있습니다. 스크립트에서 함수를 호출 할 때 해당 호출에 대해 줄 번호와 줄 간격을 알고 싶습니다.런타임시 파이썬 스크립트 라인에서 함수 호출 확인하기

다음은 예입니다. 내 스크립트 인 경우 :

foo1(); foo2(); foo1() 
foo3() 

그리고 모든 기능의 인쇄 (라인, 오프셋) 코드가 있다면, 나는 가야이 쉽게 스택을 받고하여 수행 할 수 있습니다 대부분의 경우

(0,0), (0,8), (0,16), (1,0) 

프레임에 줄 번호와 함수 이름이 포함되어 있기 때문에. 유일한 문제는 특정 줄에 같은 이름의 함수가 두 개있는 경우입니다. 불행히도 이것은 나를위한 일반적인 경우입니다. 어떤 아이디어?


좋아요. 원래 코드를 변경하는 것이 가장 간단한 해결책입니다.

당신은

if foo1(7) or foo1(6): 

또는

foo2(foo1(), foo1()) 

같은 것들을 해결할 방법이 몇 가지 매우 우아하지 솔루션은 예를 들어, 자동으로 앞의 예를 도는 있습니다

def curpos(pos, func): 
    record_curpos(pos) 
    return func 

curpos(foo2,0)(curpos(foo1,5)(), curpos(foo1,13)()) 

간단한 아이디어가 있으면 알려주세요.

답변

1

파이썬은 줄의 문자 오프셋에 대한 많은 정보를 제공하지 않습니다.

exec를 사용하여 파이썬을 실행하는 경우 코드를 실행하기 전에 기계어로 코드를 다시 작성하여 원하는 내용을 알려줄 수 있습니다. 주석 코드에

foo1(); foo2(); foo1() 
foo3() 

:

curpos(1,0); foo1(); curpos(1,8); foo2(); curpos(1,16); foo1() 
curpos(2,0); foo3() 

을 후 주석 코드를 간부 인 예를 들어, 원래의 코드를 변경할 수 있습니다.

여기서 curpos(line,char)은 원래 코드에서 해당 점의 줄과 문자 정보를 기록하거나 인쇄합니다. 스택 프레임을 사용하는 것보다 훨씬 간단합니다.

0

물론 문자열의 라인을보고, 그리고 신뢰할 수있는하지 않지만 그들이하는 기능, 예를 들어 별칭 경우, 함수 이름을 찾으려고 당신은 할 수 :

bar = foo2 
foo1(); foo2() 

그렇지 않으면 정말 힘들어을 . coverage 모듈은이 작업을 수행하고 Ned는 특정 기술을 in a blog post으로 설명했습니다. 기본적으로 바이트 코드를 다른 (가짜) 줄 번호로 구분하기 위해 다시 작성해야합니다.

실제로이 경우 서비스 제공 모듈 자체를 사용할 수 있습니다.

+0

사실, 바이트 코드 재 작성은 다른 게시물에있었습니다 : http://nedbatchelder.com/blog/200804/wicked_hack_python_bytecode_tracing.html (나는 지점 커버리지를 얻으 려하지 않았다.) –

+0

감사합니다. 매우 관련성이 높고 (흥미 롭다) – Dani