WebAssembly接口类型被移除,以支持wit-bindgen,如这里所讨论的:https://github.com/bytecodealliance/wasmtime/issues/677#issuecomment-1024087373。
我试图使用https://github.com/bytecodealliance/wasmtime-demos提供的接口类型支持编译旧的标记演示,并在python运行时导入wasm文件。当编译工作时,我无法导入该模块,因为该功能已被删除。因此,我试图用wit-bindgen:https://github.com/bytecodealliance/wit-bindgen重写它。
这是我的项目设置:
Cargo.toml
[package]
name = "markdown"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ['cdylib']
[dependencies]
pulldown-cmark = "0.5.3"
wit-bindgen-rust = { git = "https://github.com/bytecodealliance/wit-bindgen" }src/render.wit
render: func(name: string) -> stringsrc/lib.rs
use pulldown_cmark::{html, Parser};
wit_bindgen_rust::export!("./src/render.wit");
struct Render;
impl render::Render for Render {
fn render(input: String) -> String {
let parser = Parser::new(&input);
let mut html_output = String::new();
html::push_html(&mut html_output, parser);
return html_output;
}
}我可以用cargo build编译这个文件,并使用cp /target/wasm32-unknown-unknown/release/markdown.wasm .将wasm文件移动到根目录。python绑定文件bindings.py是通过发出wit-bindgen wasmtime-py --import src/render.wit生成的。
如何在python中最终导入wasm文件?我尝试了以下几点:
import wasmtime.loader
import markdown但这给了我一个错误:
File ~/.local/lib/python3.10/site-packages/wasmtime/loader.py:72, in _WasmtimeLoader.exec_module(self, module)
70 break
71 field_name = wasm_import.name
---> 72 imported_module = importlib.import_module(module_name)
73 item = imported_module.__dict__[field_name]
74 if not isinstance(item, Func) and \
75 not isinstance(item, Table) and \
76 not isinstance(item, Global) and \
77 not isinstance(item, Memory):
File /usr/lib/python3.10/importlib/__init__.py:126, in import_module(name, package)
124 break
125 level += 1
--> 126 return _bootstrap._gcd_import(name[level:], package, level)
ModuleNotFoundError: No module named '__wbindgen_placeholder__'我相信这是因为bindings.py文件没有被使用。如何使用python-wasmtime指定它?
发布于 2022-07-02 20:35:32
我最近做了一些类似的事
在Python代码中,您可以这样做以使其工作:
from wasmtime import Engine, Store, Config, Module, Linker, WasiConfig
from md import bindings
config = Config()
engine = Engine(config)
store = Store(engine)
store.set_wasi(WasiConfig())
module = Module.from_file(engine, path)
linker = Linker(engine)
linker.define_wasi()
markdown = bindings.Markdown(store, linker, module)
res = markdown.render(store, text)您还可以在这里查看完整的示例:https://github.com/olavvatne/python-webassembly-rust
https://stackoverflow.com/questions/72758778
复制相似问题