js在网络页面上调用py脚本
浏览器里跑的网络 JavaScript 想直接喊一声“Python,你过来一下”,页面用这事儿没那么简单。上调JS 在 V8 引擎里蹦跶,网络Python 在 CPython 解释器里待着,页面用两者之间隔着一堵墙——这堵墙叫进程边界。上调你不能像调函数那样 `pyScript()` 就完事,网络得靠“传话”的页面用方式。 最土也最稳的上调办法:后端搭个 HTTP 接口。前端 JS 用 `fetch` 把数据 POST 过去,网络后端用 Flask 或 FastAPI 写个路由,页面用收到请求后 `subprocess.run(['python',上调 'script.py'])` 跑脚本,再把 stdout 抓回来返回 JSON。网络我去年做一个数据清洗页面就这么干的页面用。用户点“开始处理”,上调JS 发请求,Flask 调 pandas 脚本,结果回传,页面更新进度条。整个过程两秒内完成,用户根本不知道背后换了语言。 但有个坑:每次请求都启动新 Python 进程,开销不小。脚本启动就要 0.3 秒,数据量大了更慢。后来我把脚本改成常驻服务,用 `child_process` 的思路——Node 起一个 Python 子进程,通过 stdin/stdout 持续通信。JS 这边写一行 JSON 加换行符,Python 那边 `for line in sys.stdin` 读,处理完 `print(json.dumps(result))` 再 `sys.stdout.flush()`。这样只启动一次,后续都是管道传数据,快得多。 WebSocket 是另一个选择。前端 `new WebSocket('ws://localhost:8765')`,后端用 Python 的 `websockets` 库监听。JS 发消息,Python 收到后执行逻辑,再推回结果。适合那种需要实时反馈的场景,比如我见过一个在线 Python 代码执行器,用户敲一行代码,右边立刻出结果,底层就是 WebSocket 双向通信。 有人问:能不能直接在浏览器里跑 Python?能,但那是 Pyodide——把 CPython 编译成 WebAssembly,在浏览器里模拟一个 Python 环境。你 `