PyScript导入sklearn依赖后页面长时间加载卡住如何解决
问题概述
使用PyScript进行网站开发,通过Live Server调试运行时,配置sklearn相关依赖后页面加载耗时极久,长时间无法完成加载。经测试该异常仅在引入sklearn相关依赖时触发,页面长期停留在如下加载提示状态,无响应:
Loading runtime...
Runtime created...
Initializing components...
所用PyScript代码如下:
<!DOCTYPE=html> <html> <head> <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" /> <script defer src="https://pyscript.net/alpha/pyscript.js"></script> </head> <body> <py-env> - numpy - pandas - sklearn.model_selection - sklearn.naive_bayes - sklearn.feature_extraction </py-env> <py-script> import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import TfidfVectorizer </py-script> </body> </html>
产生原因
- 依赖声明格式错误:
<py-env>的作用是声明需要安装的PyPI/conda顶层包,不支持直接填写sklearn的子模块路径,错误的包名会导致依赖解析逻辑持续重试、陷入死循环,无法完成依赖拉取流程。 - 包体积过大:scikit-learn本身连带scipy等底层依赖的WASM版本总体积超过100MB,浏览器端需要先完成全量包下载、WASM环境初始化才能进入页面可用状态,正常网络环境下首次加载也需要数分钟,弱网下耗时会进一步增加。
- 版本兼容缺陷:当前使用的是PyScript最早的Alpha版本,对scikit-learn这类包含大量C扩展的科学计算包兼容度较差,依赖解析、内存加载环节存在已知的卡死bug。
可行解决方案
- 修正依赖配置:
<py-env>中只声明顶层包名,不要填写子模块路径,同时注意scikit-learn的包名不是sklearn,修正后的依赖配置如下:
- numpy - pandas - scikit-learn
注意:子模块导入逻辑只需要写在<py-script>的Python代码中即可,不需要在环境配置阶段声明。
- 升级PyScript到正式稳定版本:替换页面中引用的Alpha版本资源,正式版优化了科学计算包的依赖解析逻辑和加载速度,修复了旧版本加载sklearn时的卡死问题。
- 利用浏览器缓存减少重复加载:首次成功加载所有依赖后,浏览器会将包文件缓存到本地,后续调试打开页面时不需要重复拉取,加载耗时可以压缩到数秒;调试阶段不要频繁清除浏览器缓存,避免重复触发全量下载。
- 轻量化替代减少加载体积:如果仅用到数据集拆分、朴素贝叶斯分类、TF-IDF特征提取这几个功能,可以改用纯Python实现的轻量化工具替代完整scikit-learn包,从根源上降低需要加载的资源体积。
- 自定义加载提示:修改默认加载状态的提示文案,明确告知用户当前正在加载计算依赖,避免误判为页面崩溃。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

