
本文介绍如何通过 pyscript 的 `src` 属性将外部 `.py` 文件链接到 html 页面,实现逻辑与界面分离,避免内联代码杂乱,并解决包导入问题。需配合本地 http 服务器运行。
在 Web 前端中直接运行 Python 代码并非原生支持,但借助 PyScript(一个基于 WebAssembly 的 Python 运行时),你可以在浏览器中执行 Python。关键在于:不能像 <script src="..."> 那样直接加载本地 .py 文件(因浏览器安全策略禁止读取本地文件系统),而必须通过 HTTP URL 加载——即你的 Python 文件需托管在可访问的服务器上。
✅ 正确做法:使用 <py-script src="..."> + 本地 HTTP 服务
-
准备文件结构
my-game/ ├── index.html └── game_logic.py
-
在 index.html 中引用外部 Python 文件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>My Python Game</title> <link rel="stylesheet" href="https://www.php.cn/link/850adac65bb85d5b2f51a14570d7eba8latest/pyscript.css" /> <script defer src="https://www.php.cn/link/850adac65bb85d5b2f51a14570d7eba8latest/pyscript.js"></script> </head> <body> <h1>? My Browser Game</h1> <div id="output"></div> <!-- 引用外部 Python 文件(URL 路径) --> <py-script src="./game_logic.py"></py-script> </body> </html> -
编写 game_logic.py(示例)
立即学习“Python免费学习笔记(深入)”;
# game_logic.py from pyscript import display def start_game(): display("Welcome to the Python Game!", target="output", append=False) # 自动执行初始化(PyScript 会立即运行此脚本) start_game() -
启动本地 HTTP 服务器(必需!)
在 my-game/ 目录下运行:python -m http.server 8000
然后访问 http://localhost:8000 —— 此时 ./game_logic.py 可被正确加载为相对 URL。
⚠️ 重要注意事项
- ❌ 不要写 src="file:///path/to/game_logic.py":浏览器会因 CORS 和安全限制拒绝加载本地 file:// 协议资源。
- ✅ 所有资源(HTML、.py、依赖包)必须通过 http:// 或 https:// 提供;PyScript 不支持跨域加载(除非服务端配置了 CORS)。
- ? 第三方包需显式声明:若 game_logic.py 使用 numpy 或 pygame(注意:pygame 不支持 浏览器环境),需在 HTML 中通过 <py-config> 指定:
<py-config> packages = ["numpy"] </py-config>
- ? 调试技巧:打开浏览器开发者工具(F12)→ Console 标签页,查看 PyScript 加载日志和报错信息;网络(Network)标签可确认 .py 文件是否成功加载。
? 总结
将 Python 逻辑拆分为独立 .py 文件并用 <py-script src="..."> 引入,是提升可维护性、支持模块化开发的关键一步。但务必牢记:这不是传统意义上的“脚本引用”,而是通过 Web 服务器提供可跨域获取的 Python 源码,由 PyScript 在浏览器中解析执行。对于初学者,建议从 python -m http.server 入手,后续再迁移到 Flask/Vite 等更健壮的服务方案。











