我有一個用Python編寫的小型Web服務器應用程序,它從數據庫系統獲取一些數據並將其作爲XML返回給用戶。該部分工作正常 - 我可以從命令行運行Python Web服務器應用程序,我可以讓客戶端連接到它並獲取數據。目前,要運行Web服務器,我必須以管理員用戶身份登錄到我們的服務器,並且必須手動啓動Web服務器。我想讓Web服務器在系統啓動時作爲服務自動啓動並在後臺運行。在Windows中運行Python Web服務器作爲服務
從ActiveState的網站,並StackOverflow使用代碼,我有一個如何去建立一個服務一個不錯的想法,我想我已經得到了位排序 - 我可以安裝並啓動我的Web服務器作爲Windows服務。然而,我不能弄清楚如何再次停止服務。我的Web服務器是從BaseHTTPServer創建:
server = BaseHTTPServer.HTTPServer(('', 8081), SIMSAPIServerHandler)
server.serve_forever()
的serve_forever()調用,很自然地,使Web服務器坐在一個無限循環,等待HTTP連接(或者用CTRL-Break按鍵,不實用一項服務)。我從上面的示例代碼中瞭解到,您的main()函數應該處於無限循環中,並且只有在出現「停止」條件時纔會突破它。我的主要調用serve_forever()。我有一個SvcStop功能:
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
exit(0)
這似乎當我在命令行「蟒蛇爲MyService一站式」得到所謂的(我可以把調試行中有產生輸出到文件),但不實際上退出整個服務 - 後續調用「則將MyService蟒開始」給我一個錯誤:
Error starting service: An instance of the service is already running.
和後續調用停止給我:
Error stopping service: The service cannot accept control messages at this time. (1061)
我想我需要一些既重serve_forever(serve_until_stop_received或其他)的位置,或者我需要某種方式來修改SvcStop,以便停止整個服務。
這裏的完整列表(我修剪包括/註釋以節省空間):
class SIMSAPIServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
try:
reportTuple = self.path.partition("/")
if len(reportTuple) < 3:
return
if reportTuple[2] == "":
return
os.system("C:\\Programs\\SIMSAPI\\runCommandReporter.bat " + reportTuple[2])
f = open("C:\\Programs\\SIMSAPI\\out.xml", "rb")
self.send_response(200)
self.send_header('Content-type', "application/xml")
self.end_headers()
self.wfile.write(f.read())
f.close()
# The output from CommandReporter is simply dumped to out.xml, which we read, write to the user, then remove.
os.unlink("C:\\Programs\\SIMSAPI\\out.xml")
return
except IOError:
self.send_error(404,'File Not Found: %s' % self.path)
class SIMSAPI(win32serviceutil.ServiceFramework):
_svc_name_ = "SIMSAPI"
_svc_display_name_ = "A simple web server"
_svc_description_ = "Serves XML data produced by SIMS CommandReporter"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
exit(0)
def SvcDoRun(self):
import servicemanager
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,servicemanager.PYS_SERVICE_STARTED,(self._svc_name_, ''))
self.timeout = 3000
while 1:
server = BaseHTTPServer.HTTPServer(('', 8081), SIMSAPIServerHandler)
server.serve_forever()
def ctrlHandler(ctrlType):
return True
if __name__ == '__main__':
win32api.SetConsoleCtrlHandler(ctrlHandler, True)
win32serviceutil.HandleCommandLine(SIMSAPI)
可以與你在同一範圍[這裏](http://stackoverflow.com/questions/228問題幫助14933 /使服務器和控制檯守護進程,作爲服務型窗口) – 2014-04-03 08:12:58