mirror of
https://github.com/RustPython/RustPython.git
synced 2026-06-02 19:39:49 +09:00
Merge pull request #3667 from youknowone/canister
complex embedding and generator example
This commit is contained in:
49
examples/generator.rs
Normal file
49
examples/generator.rs
Normal file
@@ -0,0 +1,49 @@
|
||||
use rustpython_vm as vm;
|
||||
use vm::{
|
||||
builtins::PyIntRef,
|
||||
protocol::{PyIter, PyIterReturn},
|
||||
Interpreter, PyResult,
|
||||
};
|
||||
|
||||
fn py_main(interp: &Interpreter) -> vm::PyResult<()> {
|
||||
let generator = interp.enter(|vm| {
|
||||
let scope = vm.new_scope_with_builtins();
|
||||
let generator = vm.run_block_expr(
|
||||
scope.clone(),
|
||||
r#"
|
||||
def gen():
|
||||
for i in range(10):
|
||||
yield i
|
||||
|
||||
gen()
|
||||
"#,
|
||||
)?;
|
||||
Ok(generator)
|
||||
})?;
|
||||
|
||||
loop {
|
||||
let r = interp.enter(|vm| {
|
||||
let v = match PyIter::new(generator.clone()).next(vm)? {
|
||||
PyIterReturn::Return(obj) => {
|
||||
PyIterReturn::Return(obj.try_into_value::<PyIntRef>(vm)?)
|
||||
}
|
||||
PyIterReturn::StopIteration(x) => PyIterReturn::StopIteration(x),
|
||||
};
|
||||
PyResult::Ok(v)
|
||||
})?;
|
||||
match r {
|
||||
PyIterReturn::Return(value) => println!("{}", value),
|
||||
PyIterReturn::StopIteration(_) => break,
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let interp = vm::Interpreter::with_init(Default::default(), |vm| {
|
||||
vm.add_native_modules(rustpython_stdlib::get_module_inits());
|
||||
});
|
||||
let result = py_main(&interp);
|
||||
std::process::exit(interp.run(|_vm| result));
|
||||
}
|
||||
24
examples/package_embed.py
Normal file
24
examples/package_embed.py
Normal file
@@ -0,0 +1,24 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import Any
|
||||
|
||||
__all__ = ["context"]
|
||||
|
||||
|
||||
@dataclass
|
||||
class Context:
|
||||
name: str
|
||||
something: Any
|
||||
|
||||
|
||||
_context = Context(
|
||||
name="test name",
|
||||
something=None,
|
||||
)
|
||||
|
||||
|
||||
def context() -> Context:
|
||||
return _context
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(context().name)
|
||||
27
examples/package_embed.rs
Normal file
27
examples/package_embed.rs
Normal file
@@ -0,0 +1,27 @@
|
||||
use rustpython_vm as vm;
|
||||
use vm::{builtins::PyStrRef, Interpreter};
|
||||
|
||||
fn py_main(interp: &Interpreter) -> vm::PyResult<PyStrRef> {
|
||||
interp.enter(|vm| {
|
||||
vm.insert_sys_path(vm.new_pyobj("examples"))
|
||||
.expect("add path");
|
||||
let module = vm.import("package_embed", None, 0)?;
|
||||
let name_func = module.get_attr("context", vm)?;
|
||||
let result = vm.invoke(&name_func, ())?;
|
||||
let result: PyStrRef = result.get_attr("name", vm)?.try_into_value(vm)?;
|
||||
vm::PyResult::Ok(result)
|
||||
})
|
||||
}
|
||||
|
||||
fn main() -> vm::PyResult<()> {
|
||||
let interp = vm::Interpreter::with_init(Default::default(), |vm| {
|
||||
vm.add_native_modules(rustpython_stdlib::get_module_inits());
|
||||
});
|
||||
let result = py_main(&interp);
|
||||
let result = result.and_then(|result| {
|
||||
println!("name: {}", result);
|
||||
Ok(())
|
||||
});
|
||||
let exit_code = interp.run(|_vm| result);
|
||||
std::process::exit(exit_code);
|
||||
}
|
||||
Reference in New Issue
Block a user