diff --git a/scripting/kicadplugins.i b/scripting/kicadplugins.i index 794009c928..1dfaa16f65 100644 --- a/scripting/kicadplugins.i +++ b/scripting/kicadplugins.i @@ -84,6 +84,85 @@ def GetWizardsBackTrace(): return FULL_BACK_TRACE +def LoadOnePlugin(Dirname, ModuleName): + """ + Load the plugin file ModuleName found in folder Dirname. + If this file cannot be loaded, its name is stored in failed_wizards_list + and the error trace is stored in FULL_BACK_TRACE + """ + import os + import sys + import traceback + + global NOT_LOADED_WIZARDS + global FULL_BACK_TRACE + + module_filename = os.path.join(Dirname, ModuleName) + + try: # If there is an error loading the script, skip it + mtime = os.path.getmtime(module_filename) + + if KICAD_PLUGINS.has_key(ModuleName): + plugin = KICAD_PLUGINS[ModuleName] + + if not plugin["modification_time"] == mtime: + mod = reload(plugin["ModuleName"]) + plugin["modification_time"] = mtime + else: + mod = plugin["ModuleName"] + else: + mod = __import__(ModuleName[:-3], locals(), globals() ) + + KICAD_PLUGINS[ModuleName]={ "filename":module_filename, + "modification_time":mtime, + "ModuleName":mod } + + except: + if NOT_LOADED_WIZARDS != "" : + NOT_LOADED_WIZARDS += "\n" + NOT_LOADED_WIZARDS += module_filename + FULL_BACK_TRACE += traceback.format_exc(sys.exc_info()) + pass + + + +def LoadOneSubdirPlugin(Dirname, SubDirname): + """ + Load the plugins found in folder Dirname/SubDirname, by loading __ini__.py file. + If files cannot be loaded, its name is stored in failed_wizards_list + and the error trace is stored in FULL_BACK_TRACE + """ + import os + import sys + import traceback + + global NOT_LOADED_WIZARDS + global FULL_BACK_TRACE + + fullPath = os.path.join(Dirname,SubDirname) + + if os.path.isdir(fullPath): + """ + Skip subdir which does not contain __init__.py, becuase if can be + a non python subdir (can be a subdir for .xsl plugins for instance) + """ + if os.path.exists( os.path.join(fullPath, '__init__.py') ): + try: # If there is an error loading the script, skip it + __import__(SubDirname, locals(), globals()) + + except: + if NOT_LOADED_WIZARDS != "" : + NOT_LOADED_WIZARDS += "\n" + NOT_LOADED_WIZARDS += fullPath + FULL_BACK_TRACE += traceback.format_exc(sys.exc_info()) + pass + + else: + if NOT_LOADED_WIZARDS != "" : + NOT_LOADED_WIZARDS += "\n" + NOT_LOADED_WIZARDS += 'Skip subdir ' + fullPath + + def LoadPlugins(bundlepath=None): """ Initialise Scripting/Plugin python environment and load plugins. @@ -149,7 +228,9 @@ def LoadPlugins(bundlepath=None): global FULL_BACK_TRACE FULL_BACK_TRACE="" # clear any existing trace - failed_wizards_list="" + + global NOT_LOADED_WIZARDS + NOT_LOADED_WIZARDS = "" # save not loaded wizards names list for later use global KICAD_PLUGINS @@ -161,38 +242,13 @@ def LoadPlugins(bundlepath=None): for module in os.listdir(plugins_dir): if os.path.isdir(os.path.join(plugins_dir,module)): - __import__(module, locals(), globals()) + LoadOneSubdirPlugin(plugins_dir, module) + continue if module == '__init__.py' or module[-3:] != '.py': continue - try: # If there is an error loading the script, skip it - module_filename = os.path.join(plugins_dir,module) - mtime = os.path.getmtime(module_filename) - - if KICAD_PLUGINS.has_key(module): - plugin = KICAD_PLUGINS[module] - if not plugin["modification_time"] == mtime: - mod = reload(plugin["module"]) - plugin["modification_time"] = mtime - else: - mod = plugin["module"] - else: - mod = __import__(module[:-3], locals(), globals() ) - - KICAD_PLUGINS[module]={"filename":module_filename, - "modification_time":mtime, - "module":mod} - - except: - if failed_wizards_list != "" : - failed_wizards_list += "\n" - failed_wizards_list += module_filename - FULL_BACK_TRACE += traceback.format_exc(sys.exc_info()) - pass - - global NOT_LOADED_WIZARDS - NOT_LOADED_WIZARDS = failed_wizards_list # save not loaded wizards names list for later use + LoadOnePlugin(plugins_dir, module); class KiCadPlugin: