Python中如何隐式运行http.server命令同时输出运行提示
问题根源
你当前使用的os.system是同步阻塞接口,必须等调用的命令执行完成后才会继续向下执行后续代码,所以print语句会一直卡住直到http服务退出,同时默认会弹出控制台窗口,不符合隐式运行的要求。
实现方案
使用Python标准库的subprocess.Popen异步非阻塞接口启动后台进程,同时配置参数隐藏窗口、丢弃多余输出即可实现需求。
完整可运行代码
import subprocess def run(): # 修正后的http.server启动命令,指定服务根目录为payload所在文件夹 cmd = ["python", "-m", "http.server", "--directory", "C:/Showtape/payload", "80"] # Windows专属配置:隐藏进程的控制台窗口 startup_info = subprocess.STARTUPINFO() startup_info.dwFlags |= subprocess.STARTF_USESHOWWINDOW # 异步启动后台进程,不会阻塞主进程 subprocess.Popen( cmd, startupinfo=startup_info, creationflags=subprocess.CREATE_NO_WINDOW, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL ) # 启动后立即执行后续打印和其他业务逻辑 print("Server running...") print("Serving payload..") # 此处可继续添加其他需要同步执行的操作 if __name__ == "__main__": run()
注意事项
- 原命令参数错误:
python -m http.server如果要指定服务目录,必须添加--directory参数,直接写可执行文件路径会被识别为无效参数,上面的代码已经修正,启动后访问http://127.0.0.1/payload.exe即可下载对应文件。 - 如果要在Linux/macOS环境运行,删除
startupinfo和creationflags两个参数即可,其余逻辑通用。 - 如果需要主进程退出后http服务仍在后台运行,可在
Popen参数中添加close_fds=True。
内容的提问来源于stack exchange,提问作者yrifl
相关产品推荐
相关产品推荐

