- 前端直接运行(最简单,功能有限)
- 后端服务运行(最强大、最专业)
- 使用第三方在线平台(最方便,无需搭建)
下面我将详细介绍这三种方式,并提供代码示例。

前端直接运行(使用 Pyodide)
这种方式的核心思想是:将一个完整的 Python 解释器(CPython)编译成 WebAssembly (Wasm),然后在用户的浏览器中直接运行 Python 代码,这不需要服务器参与,所有计算都在客户端完成。
优点:
- 完全客户端: 服务器负载为零,响应速度快。
- 无需后端: 对于简单的演示或学习工具,可以快速开发。
缺点:
- 性能限制: WebAssembly 的性能虽然不错,但仍然无法与原生 Python 相比,不适合计算密集型任务。
- 安全风险: 用户可以执行任意代码,可能对浏览器本身或用户设备造成风险(需要沙箱隔离)。
- 库支持有限: 并非所有的 Python 库都能在 Pyodide 中运行,特别是那些依赖 C 扩展的库(如 NumPy, Pandas 的部分功能有专门的分支支持,但不如原生版本完善)。
如何实现(使用 Pyodide)
Pyodide 是 Mozilla 推出的一个项目,专门用于在浏览器中运行 Python。

步骤 1:HTML 结构
创建一个 index.html 文件,需要一个代码编辑区、一个输出区和一个运行按钮。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">网页运行 Python</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.2/codemirror.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.2/theme/monokai.min.css">
<style>
body { font-family: sans-serif; }
.container { display: flex; flex-direction: column; height: 100vh; }
.editor-container { flex: 1; border: 1px solid #ccc; }
.output-container { height: 200px; border: 1px solid #ccc; padding: 10px; overflow-y: auto; background-color: #f8f8f8; font-family: monospace; }
button { padding: 10px 20px; font-size: 16px; cursor: pointer; }
</style>
</head>
<body>
<div class="container">
<h1>在浏览器中运行 Python 代码</h1>
<textarea id="code-editor" class="editor-container"># 在这里输入你的 Python 代码
print("你好,世界!")
for i in range(5):
print(f"计数: {i}")
# 你甚至可以导入一些库
import math
print(f"2 的平方根是: {math.sqrt(2)}")</textarea>
<div>
<button id="run-button">运行代码</button>
</div>
<pre id="output" class="output-container">输出结果将显示在这里...</pre>
</div>
<!-- 引入 CodeMirror 编辑器 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.2/codemirror.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.2/mode/python/python.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.2/addon/edit/closebrackets.min.js"></script>
<!-- 引入 Pyodide -->
<script src="https://cdn.jsdelivr.net/pyodide/v0.24.1/full/pyodide.js"></script>
<script>
// 初始化 CodeMirror 编辑器
const editor = CodeMirror.fromTextArea(document.getElementById('code-editor'), {
mode: 'python',
theme: 'monokai',
lineNumbers: true,
autoCloseBrackets: true
});
const output = document.getElementById('output');
const runButton = document.getElementById('run-button');
// 加载 Pyodide
async function loadPyodideAndRun() {
output.textContent = '正在加载 Pyodide...';
try {
pyodide = await loadPyodide();
output.textContent = 'Pyodide 加载成功!点击运行按钮执行代码。';
runButton.disabled = false;
} catch (err) {
output.textContent = `加载 Pyodide 失败: ${err}`;
}
}
// 运行 Python 代码的函数
async function runCode() {
output.textContent = '正在运行...';
const code = editor.getValue();
try {
// Pyodide 的 `runPython` 方法会执行代码并返回最后一个表达式的值
// 我们使用 `pyodide.runPythonAsync` 来支持异步代码
const result = await pyodide.runPythonAsync(code);
if (result !== undefined) {
output.textContent += `\n>>> ${result}`;
}
} catch (err) {
output.textContent += `\n错误: ${err}`;
}
}
runButton.disabled = true;
loadPyodideAndRun();
runButton.addEventListener('click', runCode);
</script>
</body>
</html>
如何运行:
将上述代码保存为 index.html 文件,然后用浏览器打开它即可。
后端服务运行(最强大、最专业)
这是目前 Web 应用中最主流、最强大的方式,用户在网页前端输入代码,通过 API 发送到后端服务器,服务器在安全的环境中执行代码,然后将结果返回给前端。

优点:
- 功能强大: 可以使用任何 Python 库(如 NumPy, Pandas, Matplotlib, Scikit-learn 等)。
- 性能优越: 在服务器上运行,不受浏览器性能限制。
- 安全性可控: 可以通过 Docker 容器、用户权限、超时限制、代码沙箱等技术手段,极大地降低安全风险。
- 访问资源: 可以访问数据库、文件系统、网络等服务器资源。
缺点:
- 需要服务器: 必须自己搭建和维护后端服务,增加了部署和运维的复杂性。
- 网络延迟: 代码需要通过网络传输,会有一定的延迟。
如何实现(使用 Flask + Docker)
这是一个简单的架构示例:
后端服务 (Flask)
创建一个 app.py 文件。
from flask import Flask, request, jsonify
import subprocess
import sys
import os
import tempfile
import uuid
app = Flask(__name__)
# 定义一个安全的代码执行环境
ALLOWED_LIBRARIES = ['math', 'datetime'] # 允许导入的库
TIMEOUT = 5 # 代码执行超时时间(秒)
@app.route('/run', methods=['POST'])
def run_python_code():
code = request.json.get('code')
if not code:
return jsonify({'error': '没有提供代码'}), 400
# 创建一个临时文件来存储代码
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
f.write(code)
temp_file_path = f.name
output = ""
error = ""
try:
# 使用 subprocess 执行 Python 脚本
# 使用 -c 选项直接执行代码,而不是文件,更安全
# 但这里为了演示,我们使用文件
# 实际项目中,应使用更严格的沙箱,如 docker-py
process = subprocess.Popen(
[sys.executable, temp_file_path],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
stdout, stderr = process.communicate(timeout=TIMEOUT)
if stdout:
output += stdout
if stderr:
error += stderr
except subprocess.TimeoutExpired:
error += "错误:代码执行超时"
process.kill()
except Exception as e:
error += f"执行错误: {str(e)}"
finally:
# 删除临时文件
os.unlink(temp_file_path)
return jsonify({
'output': output,
'error': error
})
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
前端页面 (HTML/JavaScript)
创建一个 frontend.html 文件,用于发送代码到后端。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">Python 代码运行器 (后端版)</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.2/codemirror.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.2/theme/monokai.min.css">
<style>
body { font-family: sans-serif; display: flex; flex-direction: column; align-items: center; padding: 20px; }
.container { width: 80%; max-width: 800px; }
.editor-container { height: 300px; border: 1px solid #ccc; margin-bottom: 20px; }
#output { height: 150px; border: 1px solid #ccc; padding: 10px; background-color: #f8f8f8; white-space: pre-wrap; word-wrap: break-word; }
button { padding: 10px 20px; font-size: 16px; }
</style>
</head>
<body>
<h1>Python 代码运行器 (后端版)</h1>
<div class="container">
<textarea id="code-editor" class="editor-container"># 在这里输入你的 Python 代码
import time
print("开始执行...")
time.sleep(2)
print("执行完毕!")</textarea>
<div style="text-align: center;">
<button id="run-button">运行代码</button>
</div>
<pre id="output">等待运行...</pre>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.2/codemirror.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.2/mode/python/python.min.js"></script>
<script>
const editor = CodeMirror.fromTextArea(document.getElementById('code-editor'), {
mode: 'python',
theme: 'monokai',
lineNumbers: true
});
const output = document.getElementById('output');
const runButton = document.getElementById('run-button');
runButton.addEventListener('click', async () => {
output.textContent = '正在发送到服务器...';
const code = editor.getValue();
try {
const response = await fetch('http://localhost:5000/run', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ code: code }),
});
const result = await response.json();
if (response.ok) {
output.textContent = `输出:\n${result.output}\n错误:\n${result.error}`;
} else {
output.textContent = `服务器错误: ${result.error}`;
}
} catch (error) {
output.textContent = `网络错误: ${error.message}`;
}
});
</script>
</body>
</html>
如何运行:
- 安装 Flask:
pip install Flask - 运行后端服务:
python app.py - 用浏览器打开
frontend.html文件。 - 点击运行按钮,代码会发送到你的本地 Flask 服务器执行。
安全增强(重要!)
上面的后端示例非常基础,在生产环境中绝对不能直接使用 subprocess 来执行任意用户代码,这会带来巨大的安全风险(如服务器被入侵),必须使用更高级的沙箱技术,
- Docker 容器: 为每个代码执行请求创建一个隔离的、资源受限的 Docker 容器,执行完毕后立即销毁容器。
- RestrictedPython: 一个可以限制 Python 代码执行危险的函数和操作的库。
- Pyodide 在服务器端: 将 Pyodide 部署在服务器上,通过 API 调用,它本身有较好的沙箱隔离能力。
使用第三方在线平台(最方便)
如果你不想自己搭建任何东西,可以直接使用现有的在线 Python 编译器/解释器,这些平台通常提供了完整的开发环境。
优点:
- 开箱即用: 无需任何配置,访问网站即可使用。
- 功能丰富: 通常集成了代码编辑、运行、分享、数据可视化等功能。
- 安全: 平台已经处理了所有安全和隔离问题。
缺点:
- 依赖第三方: 服务可能不稳定,或带有商业目的(如广告、付费功能)。
- 数据隐私: 你的代码和数据会发送到第三方服务器。
知名平台:
- Google Colab: 最流行的,特别适合数据科学、机器学习,免费提供 GPU/TPU。
- Replit: 一个功能强大的在线 IDE,支持多种语言,包括 Python。
- Jupyter Notebook (在线版): 可以通过 MyBinder, Google Colab 等平台使用。
- OnlineGDB, Ideone 等: 提供简单的在线编译和运行服务。
如何使用: 直接访问这些网站,注册一个账号(如果需要),然后在网页的代码编辑器中输入你的 Python 代码,点击 "Run" 按钮即可看到结果。
总结与选择
| 方式 | 核心技术 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 前端运行 | Pyodide / WebAssembly | 完全客户端,无服务器延迟 | 性能差,库支持有限,有安全风险 | 简单的教学演示、轻量级交互工具 |
| 后端服务 | Flask/Django + Subprocess/Docker | 功能强大,性能好,安全性可控 | 需要搭建和维护服务器 | 功能完整的在线 IDE、数据分析平台、自动化脚本执行 |
| 第三方平台 | 各平台自有技术 | 方便快捷,功能丰富 | 依赖第三方,有数据隐私风险 | 快速学习、原型验证、个人项目分享 |
给你的建议:
- 如果你只是想做一个简单的网页小游戏或教学工具,让用户体验一下 Python,方式一(Pyodide) 是最简单快捷的选择。
- 如果你想开发一个功能强大、商业级的在线编程平台(比如一个在线的 Jupyter 或一个编程学习网站),那么你必须选择方式二(后端服务),并且一定要重视安全,使用 Docker 等技术进行代码隔离。
- 如果你只是想临时运行一段代码,或者和朋友分享一个简单的脚本,直接使用方式三(第三方平台),Google Colab,省时省力。
