fix for building blender as a python module,
authorCampbell Barton <ideasman42@gmail.com>
Wed, 6 Feb 2013 13:14:11 +0000 (13:14 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 6 Feb 2013 13:14:11 +0000 (13:14 +0000)
changes to internal import behavior of py3.3 broke it.

source/blender/python/generic/idprop_py_api.c
source/blender/python/intern/bpy_interface.c

index f0db535..a0e2f1a 100644 (file)
@@ -1454,6 +1454,8 @@ static PyObject *BPyInit_idprop_types(void)
 
        submodule = PyModule_Create(&IDProp_types_module_def);
 
+       IDProp_Init_Types();
+
 #define MODULE_TYPE_ADD(s, t) \
        PyModule_AddObject(s, t.tp_name, (PyObject *)&t); Py_INCREF((PyObject *)&t)
 
index e9fa00c..4f40382 100644 (file)
@@ -310,11 +310,33 @@ void BPY_python_start(int argc, const char **argv)
        (void)argv;
 
        /* must run before python initializes */
-       PyImport_ExtendInittab(bpy_internal_modules);
+       /* broken in py3.3, load explicitly below */
+       // PyImport_ExtendInittab(bpy_internal_modules);
 #endif
 
        bpy_intern_string_init();
 
+
+#ifdef WITH_PYTHON_MODULE
+       {
+               /* Manually load all modules */
+               struct _inittab *inittab_item;
+               PyObject *sys_modules = PyImport_GetModuleDict();
+
+               for (inittab_item = bpy_internal_modules; inittab_item->name; inittab_item++) {
+                       PyObject *mod = inittab_item->initfunc();
+                       if (mod) {
+                               PyDict_SetItemString(sys_modules, inittab_item->name, mod);
+                       }
+                       else {
+                               PyErr_Print();
+                               PyErr_Clear();
+                       }
+                       // Py_DECREF(mod); /* ideally would decref, but in this case we never wan't to free */
+               }
+       }
+#endif
+
        /* bpy.* and lets us import it */
        BPy_init_modules();