-
I'm working on a project Here's a minimal example that demonstrates the problem: // lib.rs
#[pymodule(name = "a")]
mod py_a {
#[pymodule_export]
use crate::b::py_b;
}
// b.rs
#[pyclass]
struct Example;
#[pymethods]
impl Example {
// ...
}
#[pymodule(name = "b", submodule)]
pub mod py_b {
#[pymodule_export]
use super::Example;
} A resulting class from a import b
b.Example() But cannot be imported directly using a dotted path to submodule: from a.b import Example My current workaround is to explicitly add module contents to globals in a python file for each submodule, e.g. from .a import b as _mod
__all__ = _mod.__all__
for name in getattr(_mod, "__all__"):
globals()[name] = getattr(_mod, name) This is less than ideal. I see that in // Inserting to sys.modules allows importing submodules nicely from Python
// e.g. from maturin_starter.submodule import SubmoduleClass
let sys = PyModule::import(py, "sys")?;
let sys_modules: Bound<'_, PyDict> = sys.getattr("modules")?.cast_into()?;
sys_modules.set_item("maturin_starter.submodule", m.getattr("submodule")?)?; Is something similar possible using declarative approach? (There's a similar discussion about submodule issues already but it's two years old.) |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 2 replies
-
Yes, you can use #[pymodule_init]
fn init(m: &Bound<'_, PyModule>) -> PyResult<()> {
let modules = PyModule::import(m.py(), "sys")?.getattr("modules")?;
modules.set_item("maturin_starter.submodule", m.getattr("submodule")?)?;
Ok(())
} |
Beta Was this translation helpful? Give feedback.
Yes, you can use
#[pymodule_init]
to apply the same trick.