diff --git a/Cargo.lock b/Cargo.lock index 2f916ef8cdb..d3939e1c066 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3479,6 +3479,7 @@ dependencies = [ "itertools 0.14.0", "num-complex", "pyo3", + "rustpython-pylib", "rustpython-stdlib", "rustpython-vm", ] diff --git a/crates/capi/Cargo.toml b/crates/capi/Cargo.toml index 70b7fc4b8c5..601989faa1d 100644 --- a/crates/capi/Cargo.toml +++ b/crates/capi/Cargo.toml @@ -15,15 +15,12 @@ crate-type = ["cdylib", "rlib"] bitflags = { workspace = true } itertools = { workspace = true } num-complex = { workspace = true } -rustpython-vm = { workspace = true, features = ["threading", "compiler"] } +rustpython-vm = { workspace = true, features = ["threading", "compiler", "importlib", "host_env"] } rustpython-stdlib = {workspace = true, features = ["threading"] } +rustpython-pylib = { workspace = true } [dev-dependencies] pyo3 = { workspace = true, features = ["auto-initialize", "abi3"] } [lints] workspace = true - -[package.metadata.cargo-shear] -# Not a direct dependency (yet), but we need to enable threading support in the stdlib. -ignored = ["rustpython-stdlib"] diff --git a/crates/capi/src/import.rs b/crates/capi/src/import.rs index d380d1f8266..3550baa1440 100644 --- a/crates/capi/src/import.rs +++ b/crates/capi/src/import.rs @@ -19,4 +19,11 @@ mod tests { let _module = py.import("sys").unwrap(); }) } + + #[test] + fn import_stdlib() { + Python::attach(|py| { + let _module = py.import("types").unwrap(); + }) + } } diff --git a/crates/capi/src/pylifecycle.rs b/crates/capi/src/pylifecycle.rs index 6760b2822a3..df964d11753 100644 --- a/crates/capi/src/pylifecycle.rs +++ b/crates/capi/src/pylifecycle.rs @@ -2,6 +2,7 @@ use crate::get_main_interpreter; use crate::pyerrors::init_exception_statics; use crate::pystate::ensure_thread_has_vm_attached; use core::ffi::c_int; +use rustpython_vm::common::rc::PyRc; use rustpython_vm::vm::thread::ThreadedVirtualMachine; use rustpython_vm::{Context, Interpreter}; use std::sync::Mutex; @@ -32,7 +33,19 @@ pub extern "C" fn Py_InitializeEx(_initsigs: c_int) { if interp.is_none() { // Safety: Interpreter was not initialized before, so we can safely assume the statics are not used unsafe { init_exception_statics(&Context::genesis().exceptions) }; - *interp = Interpreter::with_init(Default::default(), |_vm| {}).into(); + let builder = Interpreter::builder(Default::default()); + let defs = rustpython_stdlib::stdlib_module_defs(&builder.ctx); + *interp = builder + .add_native_modules(&defs) + .init_hook(|vm| { + let state = PyRc::get_mut(&mut vm.state).unwrap(); + let path = rustpython_pylib::LIB_PATH.to_owned(); + + state.config.paths.stdlib_dir = Some(path.clone()); + state.config.paths.module_search_paths.insert(0, path); + }) + .build() + .into(); drop(interp); ensure_thread_has_vm_attached(); }