7 Module implementing the Plugin Manager. |
7 Module implementing the Plugin Manager. |
8 """ |
8 """ |
9 |
9 |
10 import os |
10 import os |
11 import sys |
11 import sys |
12 import imp |
|
13 import zipfile |
12 import zipfile |
|
13 import types |
|
14 import importlib |
14 |
15 |
15 from PyQt5.QtCore import ( |
16 from PyQt5.QtCore import ( |
16 pyqtSignal, QObject, QDate, QFile, QFileInfo, QUrl, QIODevice |
17 pyqtSignal, QObject, QDate, QFile, QFileInfo, QUrl, QIODevice |
17 ) |
18 ) |
18 from PyQt5.QtGui import QPixmap |
19 from PyQt5.QtGui import QPixmap |
398 @exception PluginLoadError raised to indicate an issue loading |
399 @exception PluginLoadError raised to indicate an issue loading |
399 the plug-in |
400 the plug-in |
400 """ |
401 """ |
401 try: |
402 try: |
402 fname = "{0}.py".format(os.path.join(directory, name)) |
403 fname = "{0}.py".format(os.path.join(directory, name)) |
403 module = imp.load_source(name, fname) |
404 spec = importlib.util.spec_from_file_location(name, fname) |
|
405 module = importlib.util.module_from_spec(spec) |
|
406 sys.modules[module.__name__] = module |
|
407 spec.loader.exec_module(module) |
404 if not hasattr(module, "autoactivate"): |
408 if not hasattr(module, "autoactivate"): |
405 module.error = self.tr( |
409 module.error = self.tr( |
406 "Module is missing the 'autoactivate' attribute.") |
410 "Module is missing the 'autoactivate' attribute.") |
407 self.__failedModules[name] = module |
411 self.__failedModules[name] = module |
408 raise PluginLoadError(name) |
412 raise PluginLoadError(name) |
423 self.__onDemandInactiveModules[name] = module |
427 self.__onDemandInactiveModules[name] = module |
424 module.eric6PluginModuleName = name |
428 module.eric6PluginModuleName = name |
425 module.eric6PluginModuleFilename = fname |
429 module.eric6PluginModuleFilename = fname |
426 self.__modulesCount += 1 |
430 self.__modulesCount += 1 |
427 if reload_: |
431 if reload_: |
428 imp.reload(module) |
432 importlib.reload(module) |
429 self.initOnDemandPlugin(name) |
433 self.initOnDemandPlugin(name) |
430 try: |
434 try: |
431 pluginObject = self.__onDemandInactivePlugins[name] |
435 pluginObject = self.__onDemandInactivePlugins[name] |
432 pluginObject.initToolbar( |
436 pluginObject.initToolbar( |
433 self.__ui, e5App().getObject("ToolbarManager")) |
437 self.__ui, e5App().getObject("ToolbarManager")) |
434 except (KeyError, AttributeError): |
438 except (KeyError, AttributeError): |
435 pass |
439 pass |
436 except PluginLoadError: |
440 except PluginLoadError: |
437 print("Error loading plug-in module:", name) |
441 print("Error loading plug-in module:", name) |
438 except Exception as err: |
442 except Exception as err: |
439 module = imp.new_module(name) |
443 module = types.ModuleType(name) |
440 module.error = self.tr( |
444 module.error = self.tr( |
441 "Module failed to load. Error: {0}").format(str(err)) |
445 "Module failed to load. Error: {0}").format(str(err)) |
442 self.__failedModules[name] = module |
446 self.__failedModules[name] = module |
443 print("Error loading plug-in module:", name) |
447 print("Error loading plug-in module:", name) |
444 print(str(err)) |
448 print(str(err)) |