2009-10-16 8 views
1

다음은 코드입니다. 내가해야 할 일은 i을 전역으로 만들어 반복적으로 실행하면 i의 값이 매번 0으로 리셋되는 대신 1 씩 증가하도록하는 것입니다. main의 코드는 추적 기능이 작동하도록 '기본'에 포함 된 다른 스크립트의 코드입니다. 이것은 모두 Java에서 수행됩니다.파이썬 | 스크립트 실행 후 로컬 변수를 전역으로 만드는 방법

from __future__ import nested_scopes 
import sys 
import time 

startTime = time.time() 
timeLimit = 5000 
def traceit(frame, event, arg): 
if event == "line": 
    elapsedTime = ((time.time() - startTime)*1000) 
    if elapsedTime > timeLimit: 
     raise Exception, "The execution time has exceeded the time limit of " + str(timeLimit) + " milliseconds. Script will now terminate" 
return traceit 

sys.settrace(traceit) 
def main______(): 
    try: 
     i+=1 
    except NameError: 
     i=1 
main______() 
+2

왜 적절한 클래스로 스크립과 scriptB을 설정하려고하지 않습니다? 스크립트가 객체 메소드라면, 이것은 사소한 것입니다.왜 클래스와 객체를 사용하지 않습니까? –

+2

+1 이것은 엉망진창처럼 들린다. –

+0

나는 사용자가 스크립트를 입력 할 수있는 pyhton 편집기를 가지고있다. setTrace 함수를 통해 스크립트가 실행 된 시간을 확인해야합니다. 나는 scriptB의 main 메소드에 스크립트를 배치하여이를 수행한다. 그렇지 않으면 작동하지 않을 것이다. 대부분 작동합니다. 유일한 문제는 스크립트가 여러 번 실행될 때 scriptA의 전역 변수가 유지되지 않는 기능을 필요로한다는 것입니다. 즉 때이 시도 : \t 내가 + = 1 나가서 설명하자면 NameError 제외 : \t I = 0 은 내가 각 실행에 증가 할 것이라고했다 (스크립트가 수정되지 않은 경우) 일이 무엇을 사용했는지를 여러 번, 실행 . – frank

답변

0

함수 또는 메소드에는 정의되지 않지만 파이썬 모듈 수준에서는 파이썬에서 전역 변수를 얻는 것만큼 근접합니다. 당신은 스크립트를 실행하고 변수에 액세스 할 수 있습니다 그

from scriptA import variablename 

하여 다른 스크립트에서 것을 액세스 할 수 있습니다.

+0

varibalename이 함수 안에 있다면? 여전히 액세스 할 수 있습니까? – user2475677

+0

@ user2475677 아니, 할 수 없습니다. –

0

다음 문은 전역 변수로 i를 선언

global i 
2

그것은 당신이 너무 무겁게에 대한 사람들의 답변은 무의미 나타나는 질문을 편집 한 것은 불행한 일이다.

값이 호출에서 호출로 변경되지 않는 함수 내에서 범위 지정 변수를 작성하는 방법은 다양합니다. 그들 모두는 함수가 일류 객체이기 때문에 속성을 가질 수 있음을 이용합니다. 예를 들어 :

def f(x): 
    if not hasattr(f, "i"): 
     setattr(f, "i", 0) 
    f.i += x 
    return f.i 

이 또한 인수에 대한 기본 값으로 목록을 사용하는 해킹, 당신은 함수를 호출 할 때 다음 결코 인수에 대한 값을 제공하지 :

def f(x, my_list=[0]): 
    my_list[0] = my_list[0] + x 
    return my_list[0] 

을 .. 그러나 그것이 왜 효과가 있는지 이해하지 못하면 사용하지 않는 것이 좋을 것입니다.

0

명세서 "에 포함 된 추적 기능 작업을하기 위해 '주'"상당히 모호하지만, 당신이 있습니다 원하는 같은 소리 :

  • 실행 사용자로부터 입력을 그것은 어떤 지속적인 환경
  • 중단 실행에는 "간부"를 사용, 이런 종류의 들어

너무 오래 걸리는 경우. 예 :

import sys 
import time 

def timeout(frame,event,arg): 
    if event == 'line': 
     elapsed = (time.time()-start) * 1000 

code = """ 
try: 
    i += 1 
except NameError: 
    i = 1 
print 'current i:',i 
""" 
globals = {} 

for ii in range(3): 
    start = time.time() 
    sys.settrace(timeout) 
    exec code in globals 
    print 'final i:',globals['i'] 
2

변수를 전역으로 바꾸려면 두 가지 작업을 수행해야합니다.

  1. 그는 기능 밖에, 전역에서 변수를 정의한다.
  2. 파이썬 이이 함수가 더 큰 범위 변수를 사용해야한다는 것을 알기 위해 함수에서 global 문을 사용하십시오.

예 :

i = 0 
def inc_i(): 
    global i 
    i += 1 
+0

... 또는 스크립트 실행 사이의 값을 추적하기 위해 영구적으로 만들려고 했습니까? 아마 피클을 사용하고 싶을 것입니다. – ChipJust