我在编写脚本时遇到了一些麻烦,我将问题缩小到start_new_thread函数并没有执行“self.handle”块。我很难理解我可以在那里取代什么,或者我如何能够识别这种方法。任何人都可以建议我可以使用什么或向我解释为什么它没有看到我已经插入课堂的“句柄”方法?
from __future__ import with_statement
import pythoncom
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import sys
import optparse
import thread
import exceptions
import contextlib
import logging
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(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)
答案 0 :(得分:2)
Python没有隐式this
- 这就是为什么你需要明确地必须声明当前实例(self
)作为方法函数的第一个参数(不是那不是拼写错误),以及为什么你必须明确地使用它来访问属性或方法(也是属性)。
简而言之,您需要传递self.handle
,而不是handle
。
答案 1 :(得分:0)
要回答标题中提出的问题,我会在以下情况下识别self.
方法/变量foo
:
self
是当前作用域中的一个变量,它引用具有相应成员的对象和self.foo
来引用foo
。也就是说,self
不是Python中的关键字;它的用法仅仅是一种约定,并且解释器不知道它的特殊(常规)含义,它可以替代其他语言中的this
关键字。 (事实上,一些Python程序员避开self
并使用其他变量名,例如s
。)
但真正的一点是,无论你赋给它什么变量名,都必须始终明确指定python方法的接收器,即使在同一个类的方法的词法范围内也是如此。这是因为解释器将object.member(args)
语法基本上视为{{1}}的语法糖(试试看!);换句话说,对象方法没有给出它所属的类的任何特殊知识,并且每次访问它正在操作的对象时都必须明确地使用接收器(Class.member(object,args)
) - 即使从某种意义上说,该方法是 该对象的一部分。