docs: def __scanPlugins(self):
          """Scanning local plugin directories and third-party plugin packages.
  
          :returns: No return, but self.__plugins will be updated
  
          :raises: PluginError: raises an exception, maybe CSSLoadError, VersionError, based PluginError
          """
          self.logger.info("Initialization Plugins Start, local plugins path: %s, third party plugins: %s" % (self.plugins_abspath, self.plugin_packages))
  
          #: Load third-party plugins
          if self.plugin_packages and isinstance(self.plugin_packages, (list, tuple)):
              for package_name in self.plugin_packages:
                  try:
                      plugin = __import__(package_name)
                  except ImportError as e:
                      raise PluginError("ImportError for %s, detail is %s" %(package_name, e))
                  else:
                      plugin_abspath = os.path.dirname(os.path.abspath(plugin.__file__))
                      self.__loadPlugin(plugin, plugin_abspath, package_name)
  
          #: Load local plug-in directory
          if os.path.isdir(self.plugins_abspath) and os.path.isfile(os.path.join(self.plugins_abspath, "__init__.py")):
              for package_name in os.listdir(self.plugins_abspath):
                  package_abspath = os.path.join(self.plugins_abspath, package_name)
                  if os.path.isdir(package_abspath) and os.path.isfile(os.path.join(package_abspath, "__init__.py")):
                      self.logger.info("find plugin package: %s" % package_name)
                      #: Dynamic load module (plugins.package): you can query custom information and get the plugin's class definition through getPluginClass
                      plugin = __import__("{0}.{1}".format(self.plugins_folder, package_name), fromlist=[self.plugins_folder, ])
                      self.__loadPlugin(plugin, package_abspath, package_name)