2014-11-08 2 views
-1

모듈을 동적으로 가져오고 업데이트하고 싶습니다. 보다 효율적인 방법은 importlibimp.reloadas suggested by abarnet을 사용하는 것입니다. 그러나 또 다른 해결책은 execcompile을 사용하는 것입니다. 문자열에 저장된 모듈을 호출하고 사용할 수있는 방법을 보여주는 샘플 스크립트가 있습니다. 그러나이 모듈을 함수 test (아래 참조)에서 호출하면 작동하지 않고 오류 메시지 global name 'FRUITS' is not defined이 표시됩니다. 나는 이것이 작동하지 않는 이유를 지적하기 위해 눈의 신선한 쌍을 필요로한다. 감사.exec를 사용하여 모듈을 동적으로 업데이트하고 파이썬에서 컴파일

module_as_string = """ 
class FRUITS: 
    APPLE = "his apple" 
    PEAR = "her pear" 
class foo(object): 
    def __init__(self): 
     self.x = 1 
    def get_fruit(self): 
     return FRUITS.APPLE 
_class_name = foo """ 

def get_code_object(): 
    return compile(module_as_string, "<string>", "exec") 

def test(): 
    exec(get_code_object())   
    a = eval("_class_name()") 
    print(a.get_fruit()) 

if __name__ == "__main__": 

    # below doesn't work 
    test() 

    # below works 
    exec(get_code_object()) 
    a = eval("_class_name()") 
    print(a.get_fruit()) 

- 편집 : 나에게 당신이 요구하는 가치 아니라고 생각하면 내가이 질문을 개선 할 수있는 방법을 알려주세요. 투표 만하지 마라. 감사.

+1

나는 downvote하지 않았지만 위의 "함수 테스트 (아래 참조)에서 **이 모듈을 호출하면 ** 작동하지 않습니다 **"(강조 중 한개)에 대해 구체적으로 설명해야합니다. 잘못되어가는. – Luigi

+1

나는 다운 투표를하지는 않았지만 질문에 대한 한 가지 개선점은 왜 'importlib'을 사용하는 것에 비해 열등한 해결책이라고 인정하더라도 왜 이렇게하고 싶은지를 설명 할 수 있습니다. 또한 "작동하지 않는다"는 것은 매우 정확한 문제 진술이 아닙니다. – 5gon12eder

답변

0

함수 test 내에서 FRUIT는 지역 변수이지만 직접 액세스 할 수는 없습니다. FRUIT에 액세스하려면 추가 컨테이너 인 dict_objexec으로 전달해야하며 해당 컨테이너에서 실행 된 클래스에 액세스하는 데 사용할 수 있습니다. 아래에 작업 예제가 나와 있습니다.

관련 문제