bpy.utils.home_paths, use this to get script paths for the user/local/system blender...
authorCampbell Barton <ideasman42@gmail.com>
Thu, 11 Feb 2010 14:08:22 +0000 (14:08 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 11 Feb 2010 14:08:22 +0000 (14:08 +0000)
release/scripts/modules/bpy/utils.py
source/blender/python/generic/IDProp.h
source/blender/python/intern/bpy.c [new file with mode: 0644]
source/blender/python/intern/bpy.h [new file with mode: 0644]
source/blender/python/intern/bpy_interface.c

index 7f10be3..3f7a38f 100644 (file)
@@ -27,6 +27,7 @@ import bpy as _bpy
 import os as _os
 import sys as _sys
 
+from _bpy import home_paths
 
 def load_scripts(reload_scripts=False, refresh_scripts=False):
     import traceback
@@ -171,17 +172,15 @@ def script_paths(*args):
 
     # add user scripts dir
     user_script_path = _bpy.context.user_preferences.filepaths.python_scripts_directory
-
-    if not user_script_path:
-        # XXX - WIN32 needs checking, perhaps better call a blender internal function.
-        user_script_path = _os.path.join(_os.path.expanduser("~"), ".blender", "scripts")
-
-    user_script_path = _os.path.normpath(user_script_path)
-
-    if user_script_path not in scripts and _os.path.isdir(user_script_path):
-        scripts.append(user_script_path)
+    
+    for path in home_paths("scripts") + (user_script_path, ):
+        if path:
+            path = _os.path.normpath(path)
+            if path not in scripts and _os.path.isdir(path):
+                scripts.append(path)
 
     if not args:
+        print(scripts)
         return scripts
 
     subdir = _os.path.join(*args)
@@ -190,7 +189,7 @@ def script_paths(*args):
         path_subdir = _os.path.join(path, subdir)
         if _os.path.isdir(path_subdir):
             script_paths.append(path_subdir)
-
+    print(script_paths)
     return script_paths
 
 
index 044abf8..a431ce7 100644 (file)
@@ -49,14 +49,14 @@ typedef struct BPy_IDGroup_Iter {
 } BPy_IDGroup_Iter;
 
 PyObject *BPy_Wrap_IDProperty(struct ID *id, struct IDProperty *prop, struct IDProperty *parent);
-PyObject *BPy_Wrap_GetKeys(IDProperty *prop);
-PyObject *BPy_Wrap_GetValues(ID *id, IDProperty *prop);
-PyObject *BPy_Wrap_GetItems(ID *id, IDProperty *prop);
-int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val);
+PyObject *BPy_Wrap_GetKeys(struct IDProperty *prop);
+PyObject *BPy_Wrap_GetValues(struct ID *id, struct IDProperty *prop);
+PyObject *BPy_Wrap_GetItems(struct ID *id, struct IDProperty *prop);
+int BPy_Wrap_SetMapItem(struct IDProperty *prop, PyObject *key, PyObject *val);
 
 
-PyObject *BPy_IDGroup_WrapData( ID *id, IDProperty *prop );
-char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObject *ob);
+PyObject *BPy_IDGroup_WrapData(struct ID *id, struct IDProperty *prop );
+char *BPy_IDProperty_Map_ValidateAndCreate(char *name, struct IDProperty *group, PyObject *ob);
 
 void IDProp_Init_Types(void);
 
diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c
new file mode 100644 (file)
index 0000000..6949fb2
--- /dev/null
@@ -0,0 +1,133 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+/* This file defines the '_bpy' module which is used by python's 'bpy' package.
+ * a script writer should never directly access this module */
+#include <Python.h>
+#include "bpy_rna.h"
+#include "bpy_app.h"
+#include "bpy_props.h"
+#include "bpy_operator.h"
+#include "BLI_path_util.h"
+ /* external util modules */
+#include "../generic/Mathutils.h"
+#include "../generic/Geometry.h"
+#include "../generic/BGL.h"
+#include "../generic/IDProp.h"
+/* todo, make nice syntax for sphinx */
+static char bpy_home_paths_doc[] = "home_paths(subfolder), return 3 paths to blender home directories (system, local, user), strings will be empty when not found.";
+
+PyObject *bpy_home_paths(PyObject *self, PyObject *args)
+{
+    PyObject *ret= PyTuple_New(3);
+    char *path;
+    char *subfolder= "";
+    
+       if (!PyArg_ParseTuple(args, "|s:blender_homes", &subfolder))
+               return NULL;
+
+    path= BLI_gethome_folder(subfolder, BLI_GETHOME_SYSTEM);
+    PyTuple_SET_ITEM(ret, 0, PyUnicode_FromString(path?path:""));
+
+    path= BLI_gethome_folder(subfolder, BLI_GETHOME_LOCAL);
+    PyTuple_SET_ITEM(ret, 1, PyUnicode_FromString(path?path:""));
+
+    path= BLI_gethome_folder(subfolder, BLI_GETHOME_USER);
+    PyTuple_SET_ITEM(ret, 2, PyUnicode_FromString(path?path:""));
+    
+    return ret;
+}
+
+static PyMethodDef meth_bpy_home_paths[] = {{ "home_paths", (PyCFunction)bpy_home_paths, METH_VARARGS, bpy_home_paths_doc}};
+
+static void bpy_import_test(char *modname)
+{
+       PyObject *mod= PyImport_ImportModuleLevel(modname, NULL, NULL, NULL, 0);
+       if(mod) {
+               Py_DECREF(mod);
+       }
+       else {
+               PyErr_Print();
+               PyErr_Clear();
+       }       
+}
+
+/*****************************************************************************
+* Description: Creates the bpy module and adds it to sys.modules for importing
+*****************************************************************************/
+void BPy_init_modules( void )
+{
+    extern BPy_StructRNA *bpy_context_module;
+       PyObject *mod;
+
+       /* Needs to be first since this dir is needed for future modules */
+       char *modpath= BLI_gethome_folder("scripts/modules", BLI_GETHOME_ALL);
+       if(modpath) {
+               PyObject *sys_path= PySys_GetObject("path"); /* borrow */
+               PyObject *py_modpath= PyUnicode_FromString(modpath);
+               PyList_Insert(sys_path, 0, py_modpath); /* add first */
+               Py_DECREF(py_modpath);
+       }
+       
+       /* stand alone utility modules not related to blender directly */
+       Geometry_Init();
+       Mathutils_Init();
+       BGL_Init();
+       IDProp_Init_Types();
+
+
+       mod = PyModule_New("_bpy");
+
+       /* add the module so we can import it */
+       PyDict_SetItemString(PySys_GetObject("modules"), "_bpy", mod);
+       Py_DECREF(mod);
+
+       /* run first, initializes rna types */
+       BPY_rna_init();
+
+       PyModule_AddObject( mod, "types", BPY_rna_types() ); /* needs to be first so bpy_types can run */
+       bpy_import_test("bpy_types");
+       PyModule_AddObject( mod, "data", BPY_rna_module() ); /* imports bpy_types by running this */
+       bpy_import_test("bpy_types");
+       PyModule_AddObject( mod, "props", BPY_rna_props() );
+       PyModule_AddObject( mod, "ops", BPY_operator_module() ); /* ops is now a python module that does the conversion from SOME_OT_foo -> some.foo */
+       PyModule_AddObject( mod, "app", BPY_app_struct() );
+
+       /* bpy context */
+    bpy_context_module= ( BPy_StructRNA * ) PyObject_NEW( BPy_StructRNA, &pyrna_struct_Type );
+    RNA_pointer_create(NULL, &RNA_Context, NULL, &bpy_context_module->ptr);
+    bpy_context_module->freeptr= 0;
+    PyModule_AddObject(mod, "context", (PyObject *)bpy_context_module);
+    
+       /* utility func's that have nowhere else to go */
+       PyModule_AddObject(mod, meth_bpy_home_paths->ml_name, (PyObject *)PyCFunction_New(meth_bpy_home_paths, NULL));
+
+       /* add our own modules dir, this is a python package */
+       bpy_import_test("bpy");
+}
diff --git a/source/blender/python/intern/bpy.h b/source/blender/python/intern/bpy.h
new file mode 100644 (file)
index 0000000..10bdc6a
--- /dev/null
@@ -0,0 +1,25 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK ***** */
+void BPy_init_modules( void );
\ No newline at end of file
index 133f380..b3a3c6c 100644 (file)
 #include "compile.h"           /* for the PyCodeObject */
 #include "eval.h"              /* for PyEval_EvalCode */
 
-#include "bpy_app.h"
+#include "bpy.h"
 #include "bpy_rna.h"
-#include "bpy_props.h"
-#include "bpy_operator.h"
 #include "bpy_util.h"
 
 #ifndef WIN32
 
 #include "MEM_guardedalloc.h"
 
-#include "BLI_path_util.h"
 #include "BLI_storage.h"
 #include "BLI_fileops.h"
 #include "BLI_string.h"
+#include "BLI_path_util.h"
 
 #include "BKE_context.h"
 #include "BKE_text.h"
 #include "BPY_extern.h"
 
 #include "../generic/bpy_internal_import.h" // our own imports
-/* external util modules */
-
-#include "../generic/Mathutils.h"
-#include "../generic/Geometry.h"
-#include "../generic/BGL.h"
-#include "../generic/IDProp.h"
 
 /* for internal use, when starting and ending python scripts */
 
 /* incase a python script triggers another python call, stop bpy_context_clear from invalidating */
 static int py_call_level= 0;
-
+BPy_StructRNA *bpy_context_module= NULL; /* for fast access */
 
 // only for tests
 #define TIME_PY_RUN
@@ -148,18 +140,6 @@ void bpy_context_clear(bContext *C, PyGILState_STATE *gilstate)
        }
 }
 
-static void bpy_import_test(char *modname)
-{
-       PyObject *mod= PyImport_ImportModuleLevel(modname, NULL, NULL, NULL, 0);
-       if(mod) {
-               Py_DECREF(mod);
-       }
-       else {
-               PyErr_Print();
-               PyErr_Clear();
-       }       
-}
-
 void BPY_free_compiled_text( struct Text *text )
 {
        if( text->compiled ) {
@@ -168,62 +148,6 @@ void BPY_free_compiled_text( struct Text *text )
        }
 }
 
-/*****************************************************************************
-* Description: Creates the bpy module and adds it to sys.modules for importing
-*****************************************************************************/
-static BPy_StructRNA *bpy_context_module= NULL; /* for fast access */
-static void bpy_init_modules( void )
-{
-       PyObject *mod;
-
-       /* Needs to be first since this dir is needed for future modules */
-       char *modpath= BLI_gethome_folder("scripts/modules", BLI_GETHOME_ALL);
-       if(modpath) {
-               PyObject *sys_path= PySys_GetObject("path"); /* borrow */
-               PyObject *py_modpath= PyUnicode_FromString(modpath);
-               PyList_Insert(sys_path, 0, py_modpath); /* add first */
-               Py_DECREF(py_modpath);
-       }
-       
-       /* stand alone utility modules not related to blender directly */
-       Geometry_Init();
-       Mathutils_Init();
-       BGL_Init();
-       IDProp_Init_Types();
-
-
-       mod = PyModule_New("_bpy");
-
-       /* add the module so we can import it */
-       PyDict_SetItemString(PySys_GetObject("modules"), "_bpy", mod);
-       Py_DECREF(mod);
-
-       /* run first, initializes rna types */
-       BPY_rna_init();
-
-       PyModule_AddObject( mod, "types", BPY_rna_types() ); /* needs to be first so bpy_types can run */
-       bpy_import_test("bpy_types");
-       PyModule_AddObject( mod, "data", BPY_rna_module() ); /* imports bpy_types by running this */
-       bpy_import_test("bpy_types");
-       /* PyModule_AddObject( mod, "doc", BPY_rna_doc() ); */
-       PyModule_AddObject( mod, "props", BPY_rna_props() );
-       PyModule_AddObject( mod, "ops", BPY_operator_module() ); /* ops is now a python module that does the conversion from SOME_OT_foo -> some.foo */
-       PyModule_AddObject( mod, "app", BPY_app_struct() );
-
-       /* bpy context */
-       {
-               bpy_context_module= ( BPy_StructRNA * ) PyObject_NEW( BPy_StructRNA, &pyrna_struct_Type );
-
-               RNA_pointer_create(NULL, &RNA_Context, NULL, &bpy_context_module->ptr);
-               bpy_context_module->freeptr= 0;
-
-               PyModule_AddObject(mod, "context", (PyObject *)bpy_context_module);
-       }
-
-       /* add our own modules dir, this is a python package */
-       bpy_import_test("bpy");
-}
-
 void BPY_update_modules( void )
 {
 #if 0 // slow, this runs all the time poll, draw etc 100's of time a sec.
@@ -357,7 +281,7 @@ void BPY_start_python( int argc, char **argv )
        
        
        /* bpy.* and lets us import it */
-       bpy_init_modules(); 
+       BPy_init_modules();
 
        { /* our own import and reload functions */
                PyObject *item;