You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:27:22