pcbnew: Fix reload of python plugins in python 3

Update the reload function call to be python3 compatible along with
simplifying the load function to unify the loading of simple and
complex plugins.

Fixes: lp:1828595
* https://bugs.launchpad.net/kicad/+bug/1828595
This commit is contained in:
Ian McInerney 2019-05-29 00:52:02 +01:00 committed by Seth Hillbrand
parent 1e9da7f57b
commit 59b729c731

View File

@ -84,10 +84,12 @@ def GetWizardsBackTrace():
return FULL_BACK_TRACE return FULL_BACK_TRACE
def LoadOnePlugin(Dirname, ModuleName): def LoadPluginModule(Dirname, ModuleName, FileName):
""" """
Load the plugin file ModuleName found in folder Dirname. Load the plugin module named ModuleName located in the folder Dirname.
If this file cannot be loaded, its name is stored in failed_wizards_list The module can be either inside a file called FileName or a subdirectory
called FileName that contains a __init__.py file.
If this module cannot be loaded, its name is stored in failed_wizards_list
and the error trace is stored in FULL_BACK_TRACE and the error trace is stored in FULL_BACK_TRACE
""" """
import os import os
@ -97,21 +99,32 @@ def LoadOnePlugin(Dirname, ModuleName):
global NOT_LOADED_WIZARDS global NOT_LOADED_WIZARDS
global FULL_BACK_TRACE global FULL_BACK_TRACE
module_filename = os.path.join(Dirname, ModuleName)
try: # If there is an error loading the script, skip it try: # If there is an error loading the script, skip it
mtime = os.path.getmtime(module_filename)
module_filename = os.path.join( Dirname, FileName )
mtime = os.path.getmtime( module_filename )
if ModuleName in KICAD_PLUGINS: if ModuleName in KICAD_PLUGINS:
plugin = KICAD_PLUGINS[ModuleName] plugin = KICAD_PLUGINS[ModuleName]
if not plugin["modification_time"] == mtime: if sys.version_info >= (3,4,0):
mod = reload(plugin["ModuleName"]) import importlib
plugin["modification_time"] = mtime mod = importlib.reload( plugin["ModuleName"] )
elif sys.version_info >= (3,2,0):
"""
TODO: This branch can be removed once the required python version is >=3.4
"""
import imp
mod = imp.reload( plugin["ModuleName"] )
else: else:
mod = plugin["ModuleName"] mod = reload( plugin["ModuleName"] )
else: else:
mod = __import__(ModuleName[:-3], locals(), globals() ) if sys.version_info >= (3,0,0):
import importlib
mod = importlib.import_module( ModuleName )
else:
mod = __import__( ModuleName, locals(), globals() )
KICAD_PLUGINS[ModuleName]={ "filename":module_filename, KICAD_PLUGINS[ModuleName]={ "filename":module_filename,
"modification_time":mtime, "modification_time":mtime,
@ -124,43 +137,6 @@ def LoadOnePlugin(Dirname, ModuleName):
FULL_BACK_TRACE += traceback.format_exc() FULL_BACK_TRACE += traceback.format_exc()
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()
else:
if NOT_LOADED_WIZARDS != "" :
NOT_LOADED_WIZARDS += "\n"
NOT_LOADED_WIZARDS += 'Skip subdir ' + fullPath
def LoadPlugins(bundlepath=None): def LoadPlugins(bundlepath=None):
""" """
Initialise Scripting/Plugin python environment and load plugins. Initialise Scripting/Plugin python environment and load plugins.
@ -201,6 +177,10 @@ def LoadPlugins(bundlepath=None):
import traceback import traceback
import pcbnew import pcbnew
if sys.version_info >= (3,3,0):
import importlib
importlib.invalidate_caches()
kicad_path = os.environ.get('KICAD_PATH') kicad_path = os.environ.get('KICAD_PATH')
config_path = pcbnew.GetKicadConfigPath() config_path = pcbnew.GetKicadConfigPath()
plugin_directories=[] plugin_directories=[]
@ -245,20 +225,27 @@ def LoadPlugins(bundlepath=None):
global KICAD_PLUGINS global KICAD_PLUGINS
for plugins_dir in plugin_directories: for plugins_dir in plugin_directories:
if not os.path.isdir(plugins_dir): if not os.path.isdir( plugins_dir ):
continue continue
sys.path.append(plugins_dir) sys.path.append( plugins_dir )
for module in os.listdir(plugins_dir): for module in os.listdir(plugins_dir):
if os.path.isdir(os.path.join(plugins_dir,module)): fullPath = os.path.join( plugins_dir, module )
LoadOneSubdirPlugin(plugins_dir, module)
if os.path.isdir( fullPath ):
if os.path.exists( os.path.join( fullPath, '__init__.py' ) ):
LoadPluginModule( plugins_dir, module, module )
else:
if NOT_LOADED_WIZARDS != "" :
NOT_LOADED_WIZARDS += "\n"
NOT_LOADED_WIZARDS += 'Skip subdir ' + fullPath
continue continue
if module == '__init__.py' or module[-3:] != '.py': if module == '__init__.py' or module[-3:] != '.py':
continue continue
LoadOnePlugin(plugins_dir, module) LoadPluginModule( plugins_dir, module[:-3], module )
class KiCadPlugin: class KiCadPlugin: