2009-05-19 5 views
2

그래서 파이썬 스크립트가 있고, BaseHTTPServer가 응답을 제공합니다. 요청한 파일이 .py이면 execfile (script.py)을 사용하여 해당 스크립트를 실행합니다.파이썬에서 파이썬 호출 - 모듈 가져 오기 지속성?

질문 : 수입에 대한 특별한 규칙이 있습니까? 하나의 스크립트는 단 한번만 실행하면되고 요청 사이에 생성 된 객체를 유지하는 것이 좋습니다. 그렇게 될 것이라고 저는 믿을 수 있습니까?

execfile()을 통해 실행되는 스크립트는 다르게 실행되거나 범위 액세스 문제가 있습니까?

답변

2

execfile 메서드에 대한 설명서는 here입니다. 파이썬의 특정 버전이 지정되지 않았으므로, 우리는 2.6.2에 대해 이야기 할 것이라고 가정 할 것입니다.

execfile의 설명서에는 파일 이름, 사전 (로컬 변수로 사용) 및 두 번째 사전 (전역 변수로 사용)의 세 가지 인수가 필요하다는 것이 명시되어 있습니다. 두 번째와 세 번째 인수를 생략하면 파일의 내용은 로컬 변수를 캡처하지만 전역 변수를 부모 범위에 노출하는 모듈과 같은 자체 범위에서 실행됩니다. 따라서 파일이 지역 변수를 작성하면 보존되지 않지만 전역 변수는 유지됩니다.

그러나 로컬 및 글로벌 컨텍스트가 지정되지 않은 execfile을 실행하면 파일에 호출하는 함수의 지역 및 전역이 표시됩니다. 신뢰할 수없는 코드의 경우 이는 보안상의 취약점으로 간주되어야합니다. 지역 및 전역에 대해 두 개의 사전을 작성하여 execfile에 대한 두 번째 및 세 번째 인수로 전달하는 것이 일반적으로 좋습니다. 이러한 사전을 파일 이름으로 묶인 다른 사전에 보관하면 다음에 파일이 제공 될 때 해당 사전을 다시 사용할 수 있습니다. 그러면 파일에 의해 생성 된 개체가 유지됩니다.

간단히 말해서 : execfile은 import와 정확히 같지 않습니다. 그러나 execfile 호출 결과를 다시 사용하기 위해 지역 및 전역의 사전을 보유 할 수 있습니다.

1

execfile을 사용하지 않는 것이 좋습니다. 대신 내장 된 __import__ 함수를 사용하여 요청한 파이썬 파일을 모듈로 동적으로 가져올 수 있습니다. 여기에 그냥 쓴 테스트하는 완벽한 작업 예제 :이 경우에 따라서

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 

class Handler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     self.send_response(200) 
     self.send_header("Content-type", "text/plain") 
     self.end_headers() 

     filename = self.path.lstrip("/") 
     self.wfile.write("You requested " + filename + "\n\n") 
     if filename.endswith(".py"): 
      pyname = filename.replace("/", ".")[:-3] 
      module = __import__(pyname) 
      self.wfile.write(module.do_work()) 

HTTPServer(("",8080), Handler).serve_forever() 

, 누군가가 http://localhost:8080/some_page 다음 "당신은 some_page 요청"인쇄됩니다 방문 할 경우.

그러나 http://localhost:8080/some_module.py을 요청하면 some_module.py 파일을 Python 모듈로 가져오고 해당 모듈에 do_work 함수가 호출됩니다. 해당 모듈 코드

def do_work(): 
    return "Hello World!" 

을 포함하고 해당 요청을한다면, 그 결과 페이지는

You requested some_module.py 

Hello World! 

는 그런 것들을 처리하기위한 좋은 출발점이 될해야 할 것이다. 제쳐두고,보다 고급 웹 서버를 원할 경우 CherryPy을 적극 권장합니다.

관련 문제