2013-12-24 5 views
2

이 코드가 어떻게 작동하는지 또는 실제로 이상한 일이 발생하지 않는 것 같습니다. 나는 handle.start_new_thread에 매개 변수로 전달되는 "handle"이라는 메서드를 포함 시켰습니다. 그러나이 메서드는 인식되고 실행되지 않는 것으로 보입니다. PythonWin 에디터에서도 "self"를 입력 할 수 있습니다. 일반적으로 인식 된 옵션 목록이 미리 채워지고 핸들이이 버전에 표시되지 않지만이 파일의 작업 버전에서는 편집기에 표시됩니다.PYTHON : 동일한 클래스에서 메서드를 호출하기 위해 필요한 것은 무엇입니까?

가 (수입의 많은 여기)

class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "flaspsrv" 
    _svc_display_name_ = "Flash Policy Server" 
    _svc_description_ = "Initialize Flash Policy Server" 

    def __init__(self,args): 
     logging.basicConfig(filename='C:\\Uploads\\testing.log', level=logging.DEBUG, filemode='a', format='%(asctime)s %(levelname)s %(message)s') 
     win32serviceutil.ServiceFramework.__init__(self,args) 
     self.hWaitStop = win32event.CreateEvent(None,0,0,None) 
     socket.setdefaulttimeout(60) 

    def SvcStop(self): 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     win32event.SetEvent(self.hWaitStop) 

    def SvcDoRun(self): 
     servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, 
           servicemanager.PYS_SERVICE_STARTED, 
           (self._svc_name_,'')) 
     self.main() 

    def main(self): 
     try: 
      self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) 
     except AttributeError: 
      # AttributeError catches Python built without IPv6 
      self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     except socket.error: 
      # socket.error catches OS with IPv6 disabled 
      self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
      self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
      logging.info('Listening on port 843') 
      self.sock.bind(('localhost', 843)) 
      self.sock.listen(5) 

     try: 
      while True: 
       thread.start_new_thread(self.handle, self.sock.accept()) 
     except socket.error, e: 
      logging.info('Error accepting connection: %s' % (e[1],)) 

    def handle(self, conn, addr): 
     logging.info('Temp2') 
     addrstr = '%s:%s' % (addr[0],addr[1]) 
     try: 
      logging.info('Connection from %s' % (addrstr,)) 
      with contextlib.closing(conn): 
       # It's possible that we won't get the entire request in 
       # a single recv, but very unlikely. 
       request = conn.recv(1024).strip() 
       if request != '<policy-file-request/>\0': 
        logging.info('Unrecognized request from %s: %s' % (addrstr, request)) 
        return 
       logging.info('Valid request received from %s' % (addrstr,)) 
       fo = file('flashpolicy.xml', 'rb') 
       conn.sendall(fo.read(10001)) 
       logging.info('Sent policy file to %s' % (addrstr,)) 
     except socket.error, e: 
      logging.info('Error handling connection from %s: %s' % (addrstr, e[1])) 
     except Exception, e: 
      logging.info('Error handling connection from %s: %s' % (addrstr, e[1])) 

if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(AppServerSvc) 
+1

여전히 오류가있는 가장 작은 프로그램으로 프로그램을 줄인 다음 전체 프로그램을 질문에 붙여 넣으십시오. 자세한 정보는 http://SSCCE.ORG를 참조하십시오. –

+1

"*이 방법은 인식/실행되지 않는 것 같습니다."- 추적을 포함한 정확한 오류 메시지는 무엇입니까? –

+0

오류 메시지가 나타나지 않습니다. 이 스크립트는 서비스를 설치하는 데 사용되며, 실행시 서비스는 "main"을 실행해야합니다. 서비스가 올바르게 설치되고 로그 파일뿐만 아니라 포트 843의 LISTENS에 씁니다. 연결을 시도 할 때까지는 서비스가 자체적으로 STOPPED로 이동합니다. 파이썬으로 매우 익숙하지 않고 이것을 처음부터 빌드하기 시작할 곳이 어디인지 확신 할 수 없기 때문에이를 오류 로그로 바꾸는 방법이 확실하지 않습니다. handle 메소드의 첫 번째 행 주석은 절대로 로그 파일에 인쇄하지 않습니다. – cuckoo

답변

3

변경의 문서에서 선

thread.start_new_thread(self.handle, self.sock.accept()) 

thread.start_new_thread(self.handle, *self.sock.accept()) 

에 : 여기

코드입니다이 소켓 메서드는 튜플 (conn, address)을 반환합니다. 여기서 처리기는 세 개의 매개 변수 (self에 대한 참조 포함)를 허용합니다.

thread.start_new_thread의 두 번째 및 세 번째 매개 변수는 스레딩 모듈에 등록 된 콜백에 전달되어야하는 kwargs (키워드 어설 션) 및 입니다. 따라서 인수를 socket.accept()에서 푸는 경우가 아니면 Type Error이 수신 될 가능성이 큽니다.

따라서 처리 할 인수로 전달하기 전에 self.socket에서 반환 튜플을 압축 해제해야합니다.

+0

나는 이것을 시도하고 이전과 같은 방식으로 수행 중이며 연결 시도와 서비스가 중지 될 때까지 계속 실행됩니다. 나는 또한 자기 매개 변수를 제거하려고 시도했다. (필자가 이해할 수없는 것을 알지 못했기 때문에 나는 이해하지 못했던 것들을 변경하지 않았다.) 두 매개 변수만으로 동작하는지, 다시 똑같은 동작을하는지 보았다. – cuckoo

+0

또한 로그에 돌아 오는 매개 변수를 인쇄하려고하면 문제를 더 좁힐 수있는 방법에 대한 제안 사항이 있거나이 시점에서 아무 것도 시도해 보지 못한 것 같습니다. 그런 식으로하는 법을 모르겠다. 저는 파이썬 초보자입니다. – cuckoo

+0

두 개의 매개 변수 (conn, addr) 만 받아 들인 다음이 메소드가 변수를 로그에 기록하도록 만든 두 번째 메소드가있는이 스크립트의 사본을 작성하려고 시도했지만 로그 파일은 여전히 ​​변수를 인쇄하지 않습니다 . 뭔가가 연결되지 않고 무엇을 이해하지 못하고 있습니다. – cuckoo

관련 문제