Таким образом, после копать глубоко через много статей мне удалось найти свой род грязного решения, которое работает для меня, который полностью закрывает сервер. Для того, чтобы сделать это я включил код из следующих источников:
UI представляет собой модуль исключительно для IOS Python IDE Pythonista, которые в основном просто создает кнопку "старт", «стоп »и« visit », которые привязаны к их соответствующим функциям _t. Декодер ui.in_background просто позволяет ui оставаться отзывчивым, в то время как все происходит в фоновом режиме. - это то, что действительно закрывает сервер, но оно беспорядочно и печатает уродливую ошибку в 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. Перемещение всего, за исключением выражения «httpd.serve_forever()» за пределами функции server(), просто заставляет программу зависать при вызове функции download(). – HeyItsJono