PyApi
* refcount error if StringIO or io modules could not be imported * importing python modules like math didnt work because the script registration overwrote the script path. now just prepend the path.
This commit is contained in:
@@ -457,8 +457,7 @@ void BPY_run_ui_scripts(bContext *C, int reload)
|
||||
|
||||
PyGILState_STATE gilstate;
|
||||
PyObject *mod;
|
||||
PyObject *sys_path_orig;
|
||||
PyObject *sys_path_new;
|
||||
PyObject *sys_path;
|
||||
|
||||
gilstate = PyGILState_Ensure();
|
||||
|
||||
@@ -466,6 +465,10 @@ void BPY_run_ui_scripts(bContext *C, int reload)
|
||||
BPy_SetContext(C);
|
||||
bpy_import_main_set(CTX_data_main(C));
|
||||
|
||||
|
||||
sys_path= PySys_GetObject("path"); /* borrow */
|
||||
PyList_Insert(sys_path, 0, Py_None); /* place holder, resizes the list */
|
||||
|
||||
for(a=0; dirs[a]; a++) {
|
||||
dirname= BLI_gethome_folder(dirs[a]);
|
||||
|
||||
@@ -476,15 +479,9 @@ void BPY_run_ui_scripts(bContext *C, int reload)
|
||||
|
||||
if(!dir)
|
||||
continue;
|
||||
|
||||
/* backup sys.path */
|
||||
sys_path_orig= PySys_GetObject("path");
|
||||
Py_INCREF(sys_path_orig); /* dont free it */
|
||||
|
||||
sys_path_new= PyList_New(1);
|
||||
PyList_SET_ITEM(sys_path_new, 0, PyUnicode_FromString(dirname));
|
||||
PySys_SetObject("path", sys_path_new);
|
||||
Py_DECREF(sys_path_new);
|
||||
/* set the first dir in the sys.path for fast importing of modules */
|
||||
PyList_SetItem(sys_path, 0, PyUnicode_FromString(dirname)); /* steals the ref */
|
||||
|
||||
while((de = readdir(dir)) != NULL) {
|
||||
/* We could stat the file but easier just to let python
|
||||
@@ -514,11 +511,10 @@ void BPY_run_ui_scripts(bContext *C, int reload)
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
|
||||
PySys_SetObject("path", sys_path_orig);
|
||||
Py_DECREF(sys_path_orig);
|
||||
}
|
||||
|
||||
PyList_SetSlice(sys_path, 0, 1, NULL); /* remove the first item */
|
||||
|
||||
bpy_import_main_set(NULL);
|
||||
|
||||
PyGILState_Release(gilstate);
|
||||
|
||||
@@ -348,8 +348,8 @@ PyObject *BPY_exception_buffer(void)
|
||||
PyObject *stderr_backup = PySys_GetObject("stderr"); /* borrowed */
|
||||
PyObject *string_io = NULL;
|
||||
PyObject *string_io_buf = NULL;
|
||||
PyObject *string_io_mod;
|
||||
PyObject *string_io_getvalue;
|
||||
PyObject *string_io_mod= NULL;
|
||||
PyObject *string_io_getvalue= NULL;
|
||||
|
||||
PyObject *error_type, *error_value, *error_traceback;
|
||||
|
||||
@@ -369,14 +369,11 @@ PyObject *BPY_exception_buffer(void)
|
||||
#else
|
||||
if(! (string_io_mod= PyImport_ImportModule("io")) ) {
|
||||
#endif
|
||||
return NULL;
|
||||
goto error_cleanup;
|
||||
} else if (! (string_io = PyObject_CallMethod(string_io_mod, "StringIO", NULL))) {
|
||||
Py_DECREF(string_io_mod);
|
||||
return NULL;
|
||||
goto error_cleanup;
|
||||
} else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
|
||||
Py_DECREF(string_io_mod);
|
||||
Py_DECREF(string_io);
|
||||
return NULL;
|
||||
goto error_cleanup;
|
||||
}
|
||||
|
||||
Py_INCREF(stdout_backup); // since these were borrowed we dont want them freed when replaced.
|
||||
@@ -403,6 +400,18 @@ PyObject *BPY_exception_buffer(void)
|
||||
|
||||
PyErr_Clear();
|
||||
return string_io_buf;
|
||||
|
||||
|
||||
error_cleanup:
|
||||
/* could not import the module so print the error and close */
|
||||
Py_XDECREF(string_io_mod);
|
||||
Py_XDECREF(string_io);
|
||||
|
||||
PyErr_Restore(error_type, error_value, error_traceback);
|
||||
PyErr_Print(); /* print the error */
|
||||
PyErr_Clear();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *BPy_enum_as_string(EnumPropertyItem *item)
|
||||
|
||||
Reference in New Issue
Block a user