diff --git a/src/runtime/pymodule.cs b/src/runtime/pymodule.cs index 800edb686..d361c3f3f 100644 --- a/src/runtime/pymodule.cs +++ b/src/runtime/pymodule.cs @@ -37,5 +37,39 @@ public static PyModule FromString(string name, string code) PythonException.ThrowIfIsNull(m); return new PyModule(ref m); } + + public static bool Exists(string name) + { + // first check if there is an existing module + BorrowedReference modules = Runtime.PyImport_GetModuleDict(); + BorrowedReference m = Runtime.PyDict_GetItemString(modules, name); + return !m.IsNull; + } + + public static PyModule Create(string name, string filename = "none") + { + if (Exists(name)) return null; + BorrowedReference modules = Runtime.PyImport_GetModuleDict(); + // create a new module + var op = Runtime.PyModule_New(name); + PythonException.ThrowIfIsNull(op); + + // setup the module basics (__builtins__ and __file__) + BorrowedReference globals = Runtime.PyModule_GetDict(new BorrowedReference(op.DangerousGetAddress())); + PythonException.ThrowIfIsNull(globals); + BorrowedReference __builtins__ = Runtime.PyEval_GetBuiltins(); + PythonException.ThrowIfIsNull(__builtins__); + int rc = Runtime.PyDict_SetItemString(globals, "__builtins__", __builtins__); + PythonException.ThrowIfIsNotZero(rc); + rc = Runtime.PyDict_SetItemString(globals, "__file__", + new BorrowedReference(filename.ToPython().Handle)); + PythonException.ThrowIfIsNotZero(rc); + + // add to sys.modules + rc = Runtime.PyDict_SetItemString(modules, name, op); + PythonException.ThrowIfIsNotZero(rc); + + return new PyModule(ref op); + } } }