[Bf-taskforce25] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19666] ...

Campbell Barton ideasman42 at gmail.com
Tue Apr 14 11:03:24 CEST 2009


Though we still didn't agree to move to py3 yet.
My preference is to add python 3.0.1 into the windows and mac libs dir
and set the python version to 3 in the build systems default config.

Then we can also look at ways to bundle python with blender.

On Mon, Apr 13, 2009 at 6:03 AM, Ton Roosendaal <ton at blender.org> wrote:
> Hi Campbell,
>
> This call:
>
> PyImport_ImportModuleLevel()
>
> is new in Python 2.5. Maybe it's easier for our code to drop support of
> older python versions? Put it in the lib dir in svn or what was your
> idea?
>
> -Ton-
>
> ------------------------------------------------------------------------
> Ton Roosendaal  Blender Foundation   ton at blender.org    www.blender.org
> Blender Institute BV  Entrepotdok 57A  1018AD Amsterdam The Netherlands
>
> On 11 Apr, 2009, at 18:17, Campbell Barton wrote:
>
>> Revision: 19666
>>
>> http://projects.blender.org/plugins/scmsvn/viewcvs.php?
>> view=rev&root=bf-blender&revision=19666
>> Author:   campbellbarton
>> Date:     2009-04-11 18:17:39 +0200 (Sat, 11 Apr 2009)
>>
>> Log Message:
>> -----------
>> Added back importing UI scripts rather then running,
>> The bug was todo with bpy.data and bpy.types becoming invalid,
>> temporary fix is to re-assign them to the bpy module before running
>> python operators or panels.
>> will look into a nicer way to get this working.
>>
>> Modified Paths:
>> --------------
>>     branches/blender2.5/blender/release/ui/buttons_objects.py
>>     branches/blender2.5/blender/source/blender/python/BPY_extern.h
>>
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_interface.c
>>
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_operator_wrap.c
>>
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_panel_wrap.c
>>     branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
>>     branches/blender2.5/blender/source/blender/python/intern/bpy_util.h
>>
>> Modified: branches/blender2.5/blender/release/ui/buttons_objects.py
>> ===================================================================
>> ---
>> branches/blender2.5/blender/release/ui/buttons_objects.py     2009-04-11
>> 16:10:15 UTC (rev 19665)
>> +++
>> branches/blender2.5/blender/release/ui/buttons_objects.py     2009-04-11
>> 16:17:39 UTC (rev 19666)
>> @@ -1,4 +1,4 @@
>> -# import bpy
>> +import bpy
>>
>>  class OBJECT_PT_transform(bpy.types.Panel):
>>       __label__ = "Transform"
>>
>> Modified:
>> branches/blender2.5/blender/source/blender/python/BPY_extern.h
>> ===================================================================
>> ---
>> branches/blender2.5/blender/source/blender/python/BPY_extern.h        2009
>> -04-11 16:10:15 UTC (rev 19665)
>> +++
>> branches/blender2.5/blender/source/blender/python/BPY_extern.h        2009
>> -04-11 16:17:39 UTC (rev 19666)
>> @@ -101,6 +101,7 @@
>>       int BPY_run_script_space_draw(struct bContext *C, struct SpaceScript
>> * sc); // 2.5 working
>>       void BPY_run_ui_scripts(struct bContext *C);
>>  //   int BPY_run_script_space_listener(struct bContext *C, struct
>> SpaceScript * sc, struct ARegion *ar, struct wmNotifier *wmn); // 2.5
>> working
>> +     void BPY_update_modules( void ); // XXX - annoying, need this for
>> pointers that get out of date
>>
>>
>>
>>
>> Modified:
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_interface.c
>> ===================================================================
>> ---
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_interface.c       2009-04-11 16:10:15 UTC (rev 19665)
>> +++
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_interface.c       2009-04-11 16:17:39 UTC (rev 19666)
>> @@ -26,6 +26,7 @@
>>  #include "MEM_guardedalloc.h"
>>
>>  #include "BLI_util.h"
>> +#include "BLI_string.h"
>>
>>  #include "BKE_context.h"
>>  #include "BKE_text.h"
>> @@ -39,22 +40,13 @@
>>  }
>>
>>
>> /
>> ***********************************************************************
>> ******
>> -* Description: This function creates a new Python dictionary object.
>> +* Description: Creates the bpy module and adds it to sys.modules for
>> importing
>>
>> ***********************************************************************
>> ******/
>> -
>> -static PyObject *CreateGlobalDictionary( bContext *C )
>> +static void bpy_init_modules( void )
>>  {
>>       PyObject *mod;
>> -     PyObject *dict = PyDict_New(  );
>> -     PyObject *item = PyUnicode_FromString( "__main__" );
>> -     PyDict_SetItemString( dict, "__builtins__", PyEval_GetBuiltins(  ) );
>> -     PyDict_SetItemString( dict, "__name__", item );
>> -     Py_DECREF(item);
>>
>> -     /* add bpy to global namespace */
>>       mod = PyModule_New("bpy");
>> -     PyDict_SetItemString( dict, "bpy", mod );
>> -     Py_DECREF(mod);
>>
>>       PyModule_AddObject( mod, "data", BPY_rna_module() );
>>       /* PyModule_AddObject( mod, "doc", BPY_rna_doc() ); */
>> @@ -62,12 +54,35 @@
>>       PyModule_AddObject( mod, "ops", BPY_operator_module() );
>>       PyModule_AddObject( mod, "ui", BPY_ui_module() ); // XXX very
>> experemental, consider this a test, especially PyCObject is not meant
>> to be perminant
>>
>> +     /* add the module so we can import it */
>> +     PyDict_SetItemString(PySys_GetObject("modules"), "bpy", mod);
>> +     Py_DECREF(mod);
>> +}
>> +
>> +void BPY_update_modules( void )
>> +{
>> +     PyObject *mod= PyImport_ImportModuleLevel("bpy", NULL, NULL, NULL,
>> 0);
>> +     PyModule_AddObject( mod, "data", BPY_rna_module() );
>> +     PyModule_AddObject( mod, "types", BPY_rna_types() );
>> +}
>> +
>> +/
>> ***********************************************************************
>> ******
>> +* Description: This function creates a new Python dictionary object.
>> +**********************************************************************
>> *******/
>> +static PyObject *CreateGlobalDictionary( bContext *C )
>> +{
>> +     PyObject *mod;
>> +     PyObject *dict = PyDict_New(  );
>> +     PyObject *item = PyUnicode_FromString( "__main__" );
>> +     PyDict_SetItemString( dict, "__builtins__", PyEval_GetBuiltins(  ) );
>> +     PyDict_SetItemString( dict, "__name__", item );
>> +     Py_DECREF(item);
>> +
>>       // XXX - evil, need to access context
>>       item = PyCObject_FromVoidPtr( C, NULL );
>>       PyDict_SetItemString( dict, "__bpy_context__", item );
>>       Py_DECREF(item);
>>
>> -
>>       // XXX - put somewhere more logical
>>       {
>>               PyMethodDef *ml;
>> @@ -83,13 +98,18 @@
>>               }
>>       }
>>
>> +     /* add bpy to global namespace */
>> +     mod= PyImport_ImportModuleLevel("bpy", NULL, NULL, NULL, 0);
>> +     PyDict_SetItemString( dict, "bpy", mod );
>> +     Py_DECREF(mod);
>> +
>>       return dict;
>>  }
>>
>>  void BPY_start_python( void )
>>  {
>>       PyThreadState *py_tstate = NULL;
>> -
>> +
>>       Py_Initialize(  );
>>
>>       //PySys_SetArgv( argc_copy, argv_copy );
>> @@ -97,8 +117,11 @@
>>       /* Initialize thread support (also acquires lock) */
>>       PyEval_InitThreads();
>>
>> -     // todo - sys paths - our own imports
>>
>> +     /* bpy.* and lets us import it */
>> +     bpy_init_modules();
>> +
>> +
>>       py_tstate = PyGILState_GetThisThreadState();
>>       PyEval_ReleaseThread(py_tstate);
>>
>> @@ -304,16 +327,30 @@
>>  }
>>  #endif
>>
>> +// #define TIME_REGISTRATION
>> +
>> +#ifdef TIME_REGISTRATION
>> +#include "PIL_time.h"
>> +#endif
>> +
>>  /* XXX this is temporary, need a proper script registration system
>> for 2.5 */
>> -void BPY_run_ui_scripts(bContext *C)
>> +void BPY_run_ui_scripts(void)
>>  {
>> +#ifdef TIME_REGISTRATION
>> +     double time = PIL_check_seconds_timer();
>> +#endif
>>       DIR *dir;
>>       struct dirent *de;
>> -     struct stat status;
>>       char *file_extension;
>>       char path[FILE_MAX];
>>       char *dirname= BLI_gethome_folder("ui");
>> -
>> +     int filelen; /* filename length */
>> +
>> +     PyGILState_STATE gilstate;
>> +     PyObject *mod;
>> +     PyObject *sys_path_orig;
>> +     PyObject *sys_path_new;
>> +
>>       if(!dirname)
>>               return;
>>
>> @@ -321,23 +358,49 @@
>>
>>       if(!dir)
>>               return;
>> -
>> -     if (dir != NULL) {
>> -             while((de = readdir(dir)) != NULL) {
>> -                     BLI_make_file_string("/", path, dirname, de->d_name);
>> +
>> +     gilstate = PyGILState_Ensure();
>> +
>> +     /* 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);
>> +
>> +
>> +     while((de = readdir(dir)) != NULL) {
>> +             /* We could stat the file but easier just to let python
>> +              * import it and complain if theres a problem */
>> +
>> +             file_extension = strstr(de->d_name, ".py");
>> +
>> +             if(file_extension && *(file_extension + 3) == '\0') {
>> +                     filelen = strlen(de->d_name);
>> +                     BLI_strncpy(path, de->d_name, filelen-2); /* cut off the .py on
>> copy */
>>
>> -                     stat(path, &status);
>> -
>> -                     /* run if it is a .py file */
>> -                     if(S_ISREG(status.st_mode)) {
>> -                             file_extension = strstr(de->d_name, ".py");
>> -
>> -                             if(file_extension && *(file_extension + 3) == '\0')
>> -                                     BPY_run_python_script(C, path, NULL);
>> +                     mod= PyImport_ImportModuleLevel(path, NULL, NULL, NULL, 0);
>> +                     if (mod) {
>> +                             Py_DECREF(mod);
>>                       }
>> +                     else {
>> +                             PyErr_Print();
>> +                             fprintf(stderr, "unable to import \"%s\"  %s/%s\n", path,
>> dirname, de->d_name);
>> +                     }
>> +
>>               }
>> +     }
>>
>> -             closedir(dir);
>> -     }
>> +     closedir(dir);
>> +
>> +     PySys_SetObject("path", sys_path_orig);
>> +     Py_DECREF(sys_path_orig);
>> +
>> +     PyGILState_Release(gilstate);
>> +#ifdef TIME_REGISTRATION
>> +     printf("script time %f\n", (PIL_check_seconds_timer()-time));
>> +#endif
>>  }
>>
>>
>> Modified:
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_operator_wrap.c
>> ===================================================================
>> ---
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_operator_wrap.c   2009-04-11 16:10:15 UTC (rev 19665)
>> +++
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_operator_wrap.c   2009-04-11 16:17:39 UTC (rev 19666)
>> @@ -181,6 +181,8 @@
>>  #define PYOP_INVOKE 2
>>  #define PYOP_POLL 3
>>
>> +extern void BPY_update_modules( void ); //XXX temp solution
>> +
>>  static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op,
>> wmEvent *event)
>>  {
>>       PyObject *py_class = op->type->pyop_data;
>> @@ -189,6 +191,8 @@
>>       int ret_flag= (mode==PYOP_POLL ? 0:OPERATOR_CANCELLED);
>>
>>       PyGILState_STATE gilstate = PyGILState_Ensure();
>> +
>> +     BPY_update_modules(); // XXX - the RNA pointers can change so update
>> before running, would like a nicer solutuon for this.
>>
>>       args = PyTuple_New(1);
>>       PyTuple_SET_ITEM(args, 0, PyObject_GetAttrString(py_class,
>> "__rna__")); // need to use an rna instance as the first arg
>>
>> Modified:
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_panel_wrap.c
>> ===================================================================
>> ---
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_panel_wrap.c      2009-04-11 16:10:15 UTC (rev 19665)
>> +++
>> branches/blender2.5/blender/source/blender/python/intern/
>> bpy_panel_wrap.c      2009-04-11 16:17:39 UTC (rev 19666)
>> @@ -44,6 +44,8 @@
>>  #define PYPANEL_DRAW 1
>>  #define PYPANEL_POLL 2
>>
>> +extern void BPY_update_modules( void ); //XXX temp solution
>> +
>>  static int PyPanel_generic(int mode, const bContext *C, Panel *pnl)
>>  {
>>       PyObject *py_class= (PyObject *)(pnl->type->py_data);
>> @@ -55,6 +57,8 @@
>>
>>       PyGILState_STATE gilstate = PyGILState_Ensure();
>>
>> +     BPY_update_modules(); // XXX - the RNA pointers can change so update
>> before running, would like a nicer solutuon for this.
>> +
>>       args = PyTuple_New(1);
>>       RNA_pointer_create(&CTX_wm_screen(C)->id, pnl->type->srna, pnl,
>> &panelptr);
>>       PyTuple_SET_ITEM(args, 0, pyrna_struct_CreatePyObject(&panelptr));
>>
>> Modified:
>> branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
>> ===================================================================
>> ---
>> branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
>> 2009-04-11 16:10:15 UTC (rev 19665)
>> +++
>> branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
>> 2009-04-11 16:17:39 UTC (rev 19666)
>> @@ -1714,22 +1714,23 @@
>>       return list;
>>  }
>>
>> -PyTypeObject pyrna_basetype_Type;
>> +PyTypeObject pyrna_basetype_Type = BLANK_PYTHON_TYPE;
>>
>>  PyObject *BPY_rna_types(void)
>>  {
>>       BPy_BaseTypeRNA *self;
>>
>> -     memset(&pyrna_basetype_Type, 0, sizeof(pyrna_basetype_Type));
>> -     pyrna_basetype_Type.tp_name = "RNA_Types";
>> -     pyrna_basetype_Type.tp_basicsize = sizeof( BPy_BaseTypeRNA );
>> -     pyrna_basetype_Type.tp_getattro = ( getattrofunc
>> )pyrna_basetype_getattro;
>> -     pyrna_basetype_Type.tp_flags = Py_TPFLAGS_DEFAULT;
>> -     pyrna_basetype_Type.tp_methods = pyrna_basetype_methods;
>> +     if ((pyrna_basetype_Type.tp_flags & Py_TPFLAGS_READY)==0)  {
>> +             pyrna_basetype_Type.tp_name = "RNA_Types";
>> +             pyrna_basetype_Type.tp_basicsize = sizeof( BPy_BaseTypeRNA );
>> +             pyrna_basetype_Type.tp_getattro = ( getattrofunc
>> )pyrna_basetype_getattro;
>> +             pyrna_basetype_Type.tp_flags = Py_TPFLAGS_DEFAULT;
>> +             pyrna_basetype_Type.tp_methods = pyrna_basetype_methods;
>> +
>> +             if( PyType_Ready( &pyrna_basetype_Type ) < 0 )
>> +                     return NULL;
>> +     }
>>
>> -     if( PyType_Ready( &pyrna_basetype_Type ) < 0 )
>> -             return NULL;
>> -
>>       self= (BPy_BaseTypeRNA *)PyObject_NEW( BPy_BaseTypeRNA,
>> &pyrna_basetype_Type );
>>
>>
>> @@ Diff output truncated at 10240 characters. @@
>>
>> _______________________________________________
>> Bf-blender-cvs mailing list
>> Bf-blender-cvs at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>>
>
> _______________________________________________
> Bf-taskforce25 mailing list
> Bf-taskforce25 at blender.org
> http://lists.blender.org/mailman/listinfo/bf-taskforce25
>



-- 
- Campbell


More information about the Bf-taskforce25 mailing list