首页 > 解决方案 > 我正在尝试在 python 脚本中创建 HTTP 服务器,但我无法通过脚本关闭服务器

问题描述

python 版本 3.9.4 基本上,我试图启动一个 HTTP 服务器并在事件发生时关闭它。(我正在创建一个 gui 应用程序,当您单击一个按钮以查看一个文件时,它会启动一个基本的 HTTP 服务器;非常简单)。当您关闭应用程序(通过关闭窗口的事件)时,服务器会关闭。我已经尝试使用终止和 sys.exit 进行线程和多处理,但到目前为止还没有一个工作。我目前正在尝试子处理模块使用命令启动服务器。自从我尝试了 http.server 模块以来,我愿意接受任何有关启动 HTTP 服务器的更好方法的建议,但我也无法停止该服务器。这是一个基本测试,我以后可以将它集成到我的更大的应用程序中。

import subprocess
import webbrowser
import sys
import threading
import time
def startServ():
    proc = subprocess.run(['python', '-m', 'http.server'])
t1 = threading.Thread(target = startServ)

def main():
    print("starting server")
    t1.start()
    time.sleep(2)
    webbrowser.open('http://localhost:8000/my-map.html')
    print("started")
def finish():
    t1.join()
    sys.exit()
if __name__ == "__main__":
    main()
    time.sleep(5)
    finish()

而不是“time.sleep(5)”,而是触发关闭窗口的事件finish()。另外,我不太确定如何专门关闭线程(我在线程或 python 方面不是很有经验),所以finisht1.join()将如何关闭服务器的线程。我愿意接受有关如何通常启动 http 服务器并使用我的 gui 的关闭窗口事件关闭它的任何建议。

对于多处理,我尝试了这样的事情:

print("HTTP server running on port 8000")
p = Process(target = subprocess.run(['python', '-m', 'http.server']))
def main():
    webbrowser.open('http://localhost:8000/my-map.html')
    p.start()
def finish():
    p.terminate()
    sys.exit()

main并且finish可以从这里替换到第一个样本中,因为我正在尝试完成同样的事情)。

标签: python-3.xmultithreadinghttpserver

解决方案


推荐阅读