HTML中使用PyScript运行Python报sentence_transformers模块缺失错误
报错原因
- 抛出的
ModuleNotFoundError: No module named 'sentence_transformers'直接原因是:PyScript运行在浏览器内置的WASM版本Python(Pyodide)环境中,默认仅自带Python标准库和少量官方预适配的第三方包,不会自动安装代码中import的依赖。 - 现有代码的
<py-env>配置块为空,没有提前声明需要加载的sentence_transformers依赖,运行时找不到对应模块直接触发报错。 - 当前代码引用的是alpha测试版PyScript资源,对PyTorch这类重型机器学习依赖的WASM适配极差,就算补全依赖声明,也会因为底层依赖没有适配WASM环境触发连锁报错。
- 代码本身存在冗余逻辑:先后两次实例化
SentenceTransformer加载不同模型,第一次加载的模型直接被第二次覆盖,属于无效代码,会额外增加浏览器资源消耗,甚至引发内存溢出导致页面崩溃。
解决方法
- 将页面中引用的alpha版PyScript的CSS、JS资源替换为正式稳定版,移除旧alpha版本的资源引用,正式版对WASM第三方包的兼容性明显优于测试版。
- 在
<py-env>配置块中声明需要加载的依赖,注意:普通PC端Python的wheel包无法在WASM环境运行,必须使用适配Pyodide版本的编译包。基础依赖声明格式如下:
<py-env> - sentence-transformers - torch </py-env>
如果直接声明包名安装失败,提前下载对应版本的WASM编译依赖包存放到本地静态资源目录,在<py-env>中指定本地包路径加载即可。
3. 清理冗余代码:删除第一次实例化SentenceTransformer加载all-MiniLM-L6-v2的无效行,仅保留实际使用的模型初始化逻辑,减少不必要的资源开销。
4. 调整模型加载逻辑:禁止直接写模型名从公网拉取模型文件,浏览器跨域限制、网络波动都会导致模型加载失败。提前将需要用到的sentence-transformers模型文件下载到本地静态资源目录,代码中指定本地模型路径加载。
修正后完整参考代码
<html> <head> <!-- 替换为本地存放的正式版PyScript资源 --> <link rel="stylesheet" href="/static/pyscript/pyscript.css" /> <script defer src="/static/pyscript/pyscript.js"></script> <py-env> - sentence-transformers - torch <!-- 本地WASM格式依赖包可在此处补充路径声明 --> </py-env> </head> <body> <py-script> from sentence_transformers import SentenceTransformer, util sentences1 = ['The cat sits outside', 'A man is playing guitar', 'The new movie is awesome'] sentences2 = ['The dog plays in the garden', 'A woman watches TV', 'The new movie is so great'] # 替换为本地模型存放路径 model = SentenceTransformer('./static/models/all-mpnet-base-v2') embeddings1 = model.encode(sentences1, convert_to_tensor=True) embeddings2 = model.encode(sentences2, convert_to_tensor=True) cosine_scores = util.cos_sim(embeddings1, embeddings2) for i in range(len(sentences1)): print("{} \t\t {} \t\t Score: {:.4f}".format(sentences1[i], sentences2[i], cosine_scores[i][i])) print ("___________________________________________________") </py-script> </body> </html>
补充说明:WASM环境运行大体积机器学习模型的性能远低于本地原生Python环境,若加载的模型总资源体积超过300MB,不建议在PyScript中运行此类逻辑,极易出现页面长时间无响应、内存不足崩溃的问题。
内容的提问来源于stack exchange,提问作者ocean
相关产品推荐
相关产品推荐

