11 import sys |
11 import sys |
12 import zipfile |
12 import zipfile |
13 import types |
13 import types |
14 import importlib |
14 import importlib |
15 import contextlib |
15 import contextlib |
|
16 import logging |
16 |
17 |
17 from PyQt5.QtCore import ( |
18 from PyQt5.QtCore import ( |
18 pyqtSignal, QObject, QDate, QFile, QFileInfo, QUrl, QIODevice |
19 pyqtSignal, QObject, QDate, QFile, QFileInfo, QUrl, QIODevice |
19 ) |
20 ) |
20 from PyQt5.QtGui import QPixmap |
21 from PyQt5.QtGui import QPixmap |
407 sys.modules[module.__name__] = module |
408 sys.modules[module.__name__] = module |
408 spec.loader.exec_module(module) |
409 spec.loader.exec_module(module) |
409 if not hasattr(module, "autoactivate"): |
410 if not hasattr(module, "autoactivate"): |
410 module.error = self.tr( |
411 module.error = self.tr( |
411 "Module is missing the 'autoactivate' attribute.") |
412 "Module is missing the 'autoactivate' attribute.") |
|
413 logging.debug( |
|
414 "{0}: Module is missing the 'autoactivate' attribute." |
|
415 .format(name) |
|
416 ) |
412 self.__failedModules[name] = module |
417 self.__failedModules[name] = module |
413 raise PluginLoadError(name) |
418 raise PluginLoadError(name) |
414 if getattr(module, "autoactivate", False): |
419 if getattr(module, "autoactivate", False): |
415 self.__inactiveModules[name] = module |
420 self.__inactiveModules[name] = module |
416 else: |
421 else: |
419 not hasattr(module, "pluginTypename") |
424 not hasattr(module, "pluginTypename") |
420 ): |
425 ): |
421 module.error = self.tr( |
426 module.error = self.tr( |
422 "Module is missing the 'pluginType' " |
427 "Module is missing the 'pluginType' " |
423 "and/or 'pluginTypename' attributes." |
428 "and/or 'pluginTypename' attributes." |
|
429 ) |
|
430 logging.debug( |
|
431 "{0}: Module is missing the 'pluginType' " |
|
432 "and/or 'pluginTypename' attributes." |
|
433 .format(name) |
424 ) |
434 ) |
425 self.__failedModules[name] = module |
435 self.__failedModules[name] = module |
426 raise PluginLoadError(name) |
436 raise PluginLoadError(name) |
427 else: |
437 else: |
428 self.__onDemandInactiveModules[name] = module |
438 self.__onDemandInactiveModules[name] = module |
443 print("Error loading plug-in module:", name) |
453 print("Error loading plug-in module:", name) |
444 except Exception as err: |
454 except Exception as err: |
445 module = types.ModuleType(name) |
455 module = types.ModuleType(name) |
446 module.error = self.tr( |
456 module.error = self.tr( |
447 "Module failed to load. Error: {0}").format(str(err)) |
457 "Module failed to load. Error: {0}").format(str(err)) |
|
458 logging.debug( |
|
459 "{0}: Module failed to load. Error: {1}" |
|
460 .format(name, str(err)) |
|
461 ) |
448 self.__failedModules[name] = module |
462 self.__failedModules[name] = module |
449 print("Error loading plug-in module:", name) |
463 print("Error loading plug-in module:", name) |
450 print(str(err)) |
464 print(str(err)) |
451 |
465 |
452 def unloadPlugin(self, name): |
466 def unloadPlugin(self, name): |
620 try: |
634 try: |
621 obj, ok = pluginObject.activate() |
635 obj, ok = pluginObject.activate() |
622 except TypeError: |
636 except TypeError: |
623 module.error = self.tr( |
637 module.error = self.tr( |
624 "Incompatible plugin activation method.") |
638 "Incompatible plugin activation method.") |
|
639 logging.debug( |
|
640 "{0}: Incompatible plugin activation method." |
|
641 .format(name) |
|
642 ) |
625 obj = None |
643 obj = None |
626 ok = True |
644 ok = True |
627 except Exception as err: |
645 except Exception as err: |
628 module.error = str(err) |
646 module.error = str(err) |
|
647 logging.debug("{0}: {1}".format(name, str(err))) |
629 obj = None |
648 obj = None |
630 ok = False |
649 ok = False |
631 if not ok: |
650 if not ok: |
632 return None |
651 return None |
633 |
652 |