PyScript运行Python脚本遇mysql模块缺失错误如何解决?
问题分析与解决方案
核心问题
- Pyodide环境限制:PyScript基于WebAssembly版Python(Pyodide),不支持依赖原生C扩展的Python库。你用的
mysql.connector部分依赖原生扩展,无法在Pyodide中运行;而pymysql是纯Python实现,但你未正确声明依赖包。 - 浏览器同源策略:浏览器会阻止直接访问MySQL的3306端口,即使依赖配置正确,也会因跨域限制无法连接数据库。
- HTML代码错误:
<py-script>标签同时使用src属性和内部代码,会导致加载冲突。
分步解决
1. 替换为兼容Pyodide的MySQL客户端
改用纯Python实现的pymysql,并修正依赖配置:
- 修改HTML的
<py-config>:
<py-config> [[fetch]] files = ["./get_sql_where.py"] packages = ["pymysql"] </py-config>
- 修改Python脚本
get_sql_where.py,替换mysql.connector为pymysql:
import pymysql import webbrowser import time mydb = pymysql.connect( host="196.168.16.144", user="root", password="password123", database="cloud_db", auth_plugin='mysql_native_password' ) mycursor = mydb.cursor() mycursor.execute("SELECT P_TITLE,P_DESC FROM webpage WHERE P_ID = 'en_1-01'") myresult = mycursor.fetchall() print(myresult)
2. 解决跨域访问问题
浏览器禁止直接访问非HTTP/HTTPS端口,需通过后端代理中转请求:
- 用Flask写一个简单代理接口(
proxy.py):
from flask import Flask, jsonify import pymysql from flask_cors import CORS app = Flask(__name__) CORS(app) # 允许跨域请求 @app.route('/get-data') def get_data(): mydb = pymysql.connect( host="196.168.16.144", user="root", password="password123", database="cloud_db", auth_plugin='mysql_native_password' ) mycursor = mydb.cursor() mycursor.execute("SELECT P_TITLE,P_DESC FROM webpage WHERE P_ID = 'en_1-01'") myresult = mycursor.fetchall() return jsonify({"data": myresult}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)
- 修改PyScript脚本,通过代理接口获取数据:
import requests response = requests.get("http://localhost:5000/get-data") data = response.json() print(data["data"])
- 在
<py-config>中添加requests依赖:packages = ["pymysql", "requests"]
3. 修正HTML代码错误
<py-script>标签不能同时使用src属性和内部代码,二选一:
<!-- 方式1:加载外部脚本 --> <py-script src="get_sql_where.py"></py-script> <!-- 方式2:直接写内部代码 --> <py-script> import requests response = requests.get("http://localhost:5000/get-data") print(response.json()["data"]) </py-script>
内容的提问来源于stack exchange,提问作者俠客行_da code learner
相关产品推荐
相关产品推荐

