如何在同一Python脚本中启动HTTP服务、发起请求后关闭?
在同一Python脚本中临时启动、使用并关闭HTTP服务器的方法
问题出在serve_forever()会一直阻塞主线程,导致后续代码完全无法执行。下面是两种最简单的解决方式:
方法一:用线程后台运行服务器(通用场景)
把HTTP服务器放到子线程里运行,主线程就能正常执行调用子进程、发起请求等操作,完成后再关闭服务器。
import http.server import socketserver import threading import time import subprocess PORT = 8000 Handler = http.server.SimpleHTTPRequestHandler def run_server(httpd): print(f"serving at port {PORT}") httpd.serve_forever() with socketserver.TCPServer(("", PORT), Handler) as httpd: # 启动服务器线程,设置为守护线程避免主线程退出后残留进程 server_thread = threading.Thread(target=run_server, args=(httpd,)) server_thread.daemon = True server_thread.start() # 短时间等待确保服务器启动完成 time.sleep(0.5) # 执行你的核心逻辑:调用需要访问本地HTTP文件的子进程 print("启动子进程...") subprocess.run(["your_subprocess_cmd", "http://localhost:8000/target_file"]) # 关闭服务器并等待线程结束 print("关闭服务器") httpd.shutdown() server_thread.join() print("所有操作完成")
关键点说明:
- 子线程负责运行服务器,主线程不受阻塞,能正常处理业务逻辑
daemon=True保证主线程结束时,服务器线程会自动终止time.sleep(0.5)是为了避免子进程发起请求时,服务器还未完成启动
方法二:用handle_request()处理单次请求(极简场景)
如果你的子进程只会发起一次HTTP请求,可以不用线程,直接用handle_request()处理单个请求后继续执行代码。
import http.server import socketserver import subprocess PORT = 8000 Handler = http.server.SimpleHTTPRequestHandler with socketserver.TCPServer(("", PORT), Handler) as httpd: print(f"serving at port {PORT}") # 启动子进程,让它发起HTTP请求 proc = subprocess.Popen(["your_subprocess_cmd", "http://localhost:8000/target_file"]) # 处理一次客户端请求后立即返回 httpd.handle_request() # 等待子进程执行完成 proc.wait() print("服务器已关闭")
注意事项:
- 这种方式只适合子进程仅发起一次请求的场景,多次请求会导致无法处理
handle_request()会一直阻塞到接收到并处理完一个请求后才会继续执行后续代码
内容的提问来源于stack exchange,提问作者reynoldsnlp
相关产品推荐
相关产品推荐

