首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用运行标记示例

使用运行标记示例
EN

Stack Overflow用户
提问于 2022-06-26 03:52:26
回答 1查看 218关注 0票数 0

WebAssembly接口类型被移除,以支持wit-bindgen,如这里所讨论的:https://github.com/bytecodealliance/wasmtime/issues/677#issuecomment-1024087373

我试图使用https://github.com/bytecodealliance/wasmtime-demos提供的接口类型支持编译旧的标记演示,并在python运行时导入wasm文件。当编译工作时,我无法导入该模块,因为该功能已被删除。因此,我试图用wit-bindgenhttps://github.com/bytecodealliance/wit-bindgen重写它。

这是我的项目设置:

Cargo.toml

代码语言:javascript
复制
[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

代码语言:javascript
复制
render: func(name: string) -> string

src/lib.rs

代码语言:javascript
复制
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文件?我尝试了以下几点:

代码语言:javascript
复制
import wasmtime.loader
import markdown

但这给了我一个错误:

代码语言:javascript
复制
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指定它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-02 20:35:32

我最近做了一些类似的事

在Python代码中,您可以这样做以使其工作:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72758778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档