所以通過多篇文章深挖後我設法找到一種爲我的作品,其完全關閉服務器雜亂的解決方案。要做到這一點我納入從下列來源代碼:
UI是獨家的iOS版的Python IDE Pythonista一個模塊,它基本上只是創建按鈕 「開始」,「停止「和」訪問「,它們綁定到各自的_t函數。 ui.in_background修飾器只是讓ui在後臺發生事件時保持響應。 self.httpd.socket.close()
是真正關閉服務器的東西,但它很混亂,並向stdout/err輸出一個醜陋的錯誤,所以我別無選擇,只能通過將stdout/err重定向到一個死類來取消它,以便使錯誤消失。標準stdout/err行爲在之後立即恢復。感謝大家花時間和精力來幫助我,我非常感謝。
import console
import BaseHTTPServer
import SocketServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
import sys
import threading
import webbrowser
from time import sleep
import ui
original_stdout = sys.stdout
original_stderr = sys.stderr
class BasicServer(SocketServer.TCPServer):
allow_reuse_address = True
class NullifyOutput():
def write(self, s):
pass
class ServerThread(threading.Thread):
def __init__(self, ip, port):
super(ServerThread, self).__init__()
self.ip = ip
self.port = port
self.HandlerClass = SimpleHTTPRequestHandler
self.Protocol = 'HTTP/1.0'
self.server_address = (self.ip, self.port)
self.HandlerClass.protocol_version = self.Protocol
try:
self.httpd = BasicServer(self.server_address, self.HandlerClass)
except:
self.port += 1
self.server_address = (self.ip, self.port)
self.httpd = BasicServer(self.server_address, self.HandlerClass)
self.stoptheserver = threading.Event()
def run(self):
while not self.stoptheserver.isSet():
self.httpd.handle_request()
def join(self, timeout=None):
self.stoptheserver.set()
self.httpd.socket.close()
super(ServerThread, self).join(timeout)
server = ServerThread('127.0.0.1', 8000)
def start_t(sender):
print server.isAlive()
if not server.isAlive():
server.start()
def visit_t(sender):
webbrowser.open('http://127.0.0.1:' + str(server.port))
#webbrowser.open('safari-http://127.0.0.1' + str(server.port))
# Use the safari- prefix to open in safari. You may need to switch to
# pythonista then back to safari to get the page to load.
@ui.in_background
def stop_t(sender):
sys.stdout, sys.stderr = NullifyOutput(), NullifyOutput()
server.join(3)
sys.stdout, sys.stderr = original_stdout, original_stderr
ui.load_view('SimpleServer').present('sheet')
https://docs.python.org/2/library/socketserver.html#SocketServer.BaseServer.shutdown –
只是想指出,我所知道的BaseServer.shutdown()方法,但我有不知道如何在這種情況下實施它。 – HeyItsJono
不幸的是,不行。說沒有全局變量httpd。在server()函數之外移動除「httpd.serve_forever()」之外的所有內容只會在調用download()時使程序掛起。 – HeyItsJono