PyAPI: add imports arg to BPY_execute_string
[blender.git] / source / blender / python / intern / bpy_interface.c
index 123c938b921c8425e77aa7d4d19fbc2a28dca864..0c7f3a7f68d267c1c00569085d39105ea5e4378f 100644 (file)
@@ -692,7 +692,9 @@ bool BPY_execute_string_as_intptr(
        return ok;
 }
 
-bool BPY_execute_string_ex(bContext *C, const char *expr, bool use_eval)
+bool BPY_execute_string_ex(
+        bContext *C, const char *imports[],
+        const char *expr, bool use_eval)
 {
        BLI_assert(expr);
        PyGILState_STATE gilstate;
@@ -714,13 +716,18 @@ bool BPY_execute_string_ex(bContext *C, const char *expr, bool use_eval)
        bmain_back = bpy_import_main_get();
        bpy_import_main_set(CTX_data_main(C));
 
-       retval = PyRun_String(expr, use_eval ? Py_eval_input : Py_file_input, py_dict, py_dict);
+       if (imports && (!PyC_NameSpace_ImportArray(py_dict, imports))) {
+               Py_DECREF(py_dict);
+               retval = NULL;
+       }
+       else {
+               retval = PyRun_String(expr, use_eval ? Py_eval_input : Py_file_input, py_dict, py_dict);
+       }
 
        bpy_import_main_set(bmain_back);
 
        if (retval == NULL) {
                ok = false;
-
                BPy_errors_to_report(CTX_wm_reports(C));
        }
        else {
@@ -734,9 +741,11 @@ bool BPY_execute_string_ex(bContext *C, const char *expr, bool use_eval)
        return ok;
 }
 
-bool BPY_execute_string(bContext *C, const char *expr)
+bool BPY_execute_string(
+        bContext *C, const char *imports[],
+        const char *expr)
 {
-       return BPY_execute_string_ex(C, expr, true);
+       return BPY_execute_string_ex(C, imports, expr, true);
 }
 
 void BPY_modules_load_user(bContext *C)