Как запустить локальный хост, который продолжает обслуживать, пока ключевое слово не останавливает его, все из файла .py? - PullRequest
0 голосов
/ 06 сентября 2018

Когда я запускаю локальный хост-сервер для просмотра моих html-файлов, я обычно использую приглашение командной строки:

python -m http.server 8000

Однако я хочу сделать это из файла .py, и я изо всех сил. В идеале при запуске py-файла он должен запускать сервер, открывать localhost в веб-браузере по умолчанию, а затем оставаться открытым, пока пользователь не введет ключевое слово, например «exit». В соответствии с документацией http.server мой текущий код выглядит так:

import http.server
import socketserver
import webbrowser

PORT = 8000
URL = f'localhost:{PORT}/MapViz.html'

def run():
    Handler = http.server.SimpleHTTPRequestHandler
    with socketserver.TCPServer(("", PORT), Handler) as httpd:
          print("Enjoy your visualization!")
          httpd.serve_forever()

if __name__ == "__main__":
    run()
    webbrowser.open_new(URL)

Я знаю, что на данный момент ему нечего закрывать сервер после того, как пользователь закончил, но я просто пытаюсь заставить его сначала открыть браузер. Кажется, что serve_forever() не подходит для работы, но я не уверен, что это такое.

Кроме того, мне нужно беспокоиться о закрытии сокета? Я всегда был в состоянии использовать формат with open(x) as file: для файлов, чтобы не беспокоиться о закрытии их, но у меня была проблема, когда я возился с этим, когда я получил ошибку Windows 10048, сообщающую, что сокет все еще используется, так что, возможно, это также не закрывается правильно.

Спасибо!

1 Ответ

0 голосов
/ 06 сентября 2018

Вот решение, которое я использую!

import http.server
import socketserver
import webbrowser
import threading
import sys

PORT = 8000
URL = f'http://localhost:{PORT}/MapViz.html'

def run():
    Handler = http.server.SimpleHTTPRequestHandler
    global httpd
with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print(f"Enjoy your visualization!")
    httpd.serve_forever()

def maintain():
     webbrowser.open_new(URL)
while True:
    user_input = input()
    if user_input == 'EXIT' or user_input == 'exit':
        print('Shutting down! Run this .exe again to view your visualization again.')
        threading.Timer(0.1, httpd.shutdown).start()
        break

if __name__ == '__main__':
    threading.Timer(1.0, maintain).start()
    run()

Я немного подправил код, который Майкл дал мне, и у него была многопоточность. Таймер вызвал совершенно новую функцию, которая открывала окно в браузере и проверяла слово kill. Я уверен, что мое отключение не самый эффективный способ, но делает то, что мне нужно. Мне определенно нужно будет посмотреть больше примеров потоков, чтобы найти лучший

...