You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Rust编译的WebAssembly加速Brython代码的问题解决

解决Brython调用WebAssembly函数的问题

一、先修正现有代码的核心错误

你当前遇到两个关键问题:函数赋值错误、执行顺序不匹配,以下是针对性修复:

1. 修复函数赋值错误

原代码中window.wasmfunc = add_wasm()是把add_wasm()的执行结果(比如你测试的7)赋值给window.wasmfunc,而非函数本身。必须去掉括号,直接赋值函数引用:

window.wasmfunc = add_wasm; // 不要加()

2. 解决执行顺序问题

页面onload触发brython()时,Wasm的异步初始化还没完成,导致Brython代码执行时window.wasmfunc还不存在。需要把Brython的执行时机延后到Wasm初始化完成之后。

修正后的完整基础代码(挂载window方案)

<!Doctype html> 
<html> 
<head> 
    <meta charset = "utf-8"> 
    <script type = "text/javascript"
        src = "https://cdn.jsdelivr.net/npm/brython@3.8.9/brython.min.js"> 
    </script> 
</head>
<body> 
<!-- 定义Brython函数,等待Wasm就绪后调用 -->
<script type = "text/python"> 
from browser import window

def calculate_with_wasm():
    try:
        result = window.wasmfunc(3, 5)
        print(result)
    except AttributeError:
        print("Wasm函数尚未准备完成")
</script> 

<script type="module">
    import init, {add_wasm} from './pkg/hello_wasm.js';
    // 等待Wasm初始化完成
    await init();
    console.log(add_wasm(3,4))
    // 赋值函数本身到window
    window.wasmfunc = add_wasm;
    // Wasm就绪后,调用Brython的计算函数
    window.calculate_with_wasm();
</script>
</body> 
</html>

二、更优方案:无需挂载window,直接注入Brython全局命名空间

Brython允许从JavaScript直接向其全局变量空间注入内容,不用绕window,更符合模块化逻辑:

<!Doctype html> 
<html> 
<head> 
    <meta charset = "utf-8"> 
    <script type = "text/javascript"
        src = "https://cdn.jsdelivr.net/npm/brython@3.8.9/brython.min.js"> 
    </script> 
</head>
<body> 
<!-- Brython代码直接使用注入的Wasm函数 -->
<script type = "text/python"> 
# 无需从window取,直接调用add_wasm
result = add_wasm(3, 5)
print(result)
</script> 

<script type="module">
    import init, {add_wasm} from './pkg/hello_wasm.js';
    await init();
    console.log(add_wasm(3,4))
    
    // 等待Brython初始化完成
    await new Promise(resolve => {
        if (typeof brython !== 'undefined' && brython.python) {
            resolve();
        } else {
            // 先初始化Brython
            brython();
            // 监听Brython就绪事件
            document.addEventListener('brython-ready', resolve);
        }
    });
    
    // 直接把Wasm函数注入Brython全局命名空间
    brython.python.globals().add_wasm = add_wasm;
    // 重新执行所有Brython脚本,确保代码能获取到新注入的函数
    brython(1);
</script>
</body> 
</html>

关键注意点

  • 必须等待init()完成:Wasm的初始化是异步操作,await init()一定要写,否则add_wasm可能还未就绪。
  • Brython就绪判断:通过brython-ready事件或直接检查brython.python是否存在,确保能安全访问其全局空间。

内容的提问来源于stack exchange,提问作者TheTrebuchet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:50:13