diff --git a/Cargo.toml b/Cargo.toml index 6e90643efe2..879bb4e75ed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,9 +10,10 @@ repository.workspace = true license.workspace = true [features] -default = ["threading", "stdlib", "zlib", "importlib"] +default = ["threading", "stdlib", "stdio", "zlib", "importlib"] importlib = ["rustpython-vm/importlib"] encodings = ["rustpython-vm/encodings"] +stdio = ["rustpython-vm/stdio"] stdlib = ["rustpython-stdlib", "rustpython-pylib", "encodings"] flame-it = ["rustpython-vm/flame-it", "flame", "flamescope"] freeze-stdlib = ["stdlib", "rustpython-vm/freeze-stdlib", "rustpython-pylib?/freeze-stdlib"] diff --git a/vm/Cargo.toml b/vm/Cargo.toml index 4bcd8512e20..e0ca09f3329 100644 --- a/vm/Cargo.toml +++ b/vm/Cargo.toml @@ -10,7 +10,8 @@ repository.workspace = true license.workspace = true [features] -default = ["compiler", "wasmbind"] +default = ["compiler", "wasmbind", "stdio"] +stdio = [] importlib = [] encodings = ["importlib"] vm-tracing-logging = [] diff --git a/vm/src/vm/mod.rs b/vm/src/vm/mod.rs index 1a5f40e767f..dfe420ece7d 100644 --- a/vm/src/vm/mod.rs +++ b/vm/src/vm/mod.rs @@ -14,6 +14,8 @@ mod vm_new; mod vm_object; mod vm_ops; +#[cfg(not(feature = "stdio"))] +use crate::builtins::PyNone; use crate::{ builtins::{ code::PyCode, @@ -305,13 +307,19 @@ impl VirtualMachine { // builtins.open to io.OpenWrapper, but this is easier, since it doesn't // require the Python stdlib to be present let io = import::import_builtin(self, "_io")?; - let set_stdio = |name, fd, mode: &str| { + + let set_stdio = |name, _fd, _mode: &str| { + #[cfg(feature = "stdio")] let stdio = crate::stdlib::io::open( - self.ctx.new_int(fd).into(), - Some(mode), + self.ctx.new_int(_fd).into(), + Some(_mode), Default::default(), self, )?; + + #[cfg(not(feature = "stdio"))] + let stdio = PyNone.into_pyobject(self); + let dunder_name = self.ctx.intern_str(format!("__{name}__")); self.sys_module.set_attr( dunder_name, // e.g. __stdin__