如何在QGIS的startup.py脚本中安装插件后自动重载插件
解决QGIS插件安装后无需重启即可激活重载的问题
你可以通过PyQGIS的插件注册表工具和界面刷新方法,实现安装插件后立即激活并在当前会话中显示按钮,无需重启QGIS。以下是修改后的完整代码及关键步骤说明:
修改后的startup.py代码
from qgis.utils import iface, loadPlugin, startPlugin, unloadPlugin from PyQt5.QtCore import QTimer from qgis.PyQt.QtCore import QStandardPaths from qgis.core import QgsMessageLog, Qgis, QgsPluginRegistry import zipfile import os import shutil # 自动检测用户主目录 USER_HOME = os.path.expanduser("~") # 存放ZIP插件的文件夹 LOCAL_ZIP_FOLDER = os.path.join( USER_HOME, "Programs", "QGIS 3.40.8", "plugins", "Standaard actief" ) # 需要安装的插件列表 PLUGIN_LIST = [ 'tools' ] def plugin_dir(): base = QStandardPaths.standardLocations(QStandardPaths.AppDataLocation)[0] return os.path.join(base, "profiles", "default", "python", "plugins") def install_from_zip(plugin_name): zip_path = os.path.join(LOCAL_ZIP_FOLDER, plugin_name + ".zip") target_dir = os.path.join(plugin_dir(), plugin_name) if not os.path.isfile(zip_path): QgsMessageLog.logMessage(f"未找到{plugin_name}的ZIP文件", "Startup", Qgis.Warning) return False if os.path.isdir(target_dir): # 若插件已存在,先卸载旧版本避免冲突 if plugin_name in iface.activePlugins(): unloadPlugin(plugin_name) shutil.rmtree(target_dir) try: with zipfile.ZipFile(zip_path, 'r') as z: z.extractall(plugin_dir()) return True except Exception as e: QgsMessageLog.logMessage(f"解压{plugin_name}出错: {e}", "Startup", Qgis.Critical) return False def activate_plugin(plugin_name): # 获取插件注册表实例 plugin_registry = QgsPluginRegistry.instance() # 扫描插件目录,让QGIS识别新安装的插件 plugin_registry.scanPlugins() # 加载插件 if not loadPlugin(plugin_name): QgsMessageLog.logMessage(f"加载{plugin_name}失败", "Startup", Qgis.Warning) return False # 激活插件 if not startPlugin(plugin_name): QgsMessageLog.logMessage(f"激活{plugin_name}失败", "Startup", Qgis.Warning) return False # 刷新界面,显示插件按钮/菜单 iface.reloadPluginActions() QgsMessageLog.logMessage(f"{plugin_name}已成功激活", "Startup", Qgis.Success) return True def install(): QgsMessageLog.logMessage("本地ZIP插件安装器启动", "Startup", Qgis.Info) QgsMessageLog.logMessage(f"安装路径: {plugin_dir()}", "Startup", Qgis.Info) for plugin in PLUGIN_LIST: QgsMessageLog.logMessage(f"正在从ZIP安装{plugin}", "Startup", Qgis.Info) if install_from_zip(plugin): QgsMessageLog.logMessage(f"{plugin}安装完成", "Startup", Qgis.Success) # 安装成功后立即激活插件 activate_plugin(plugin) else: QgsMessageLog.logMessage(f"{plugin}安装失败", "Startup", Qgis.Warning) def delayed_start(): QTimer.singleShot(5000, install) iface.initializationCompleted.connect(delayed_start)
关键步骤说明
- 卸载旧插件(如果存在):覆盖安装前先卸载已激活的旧版本,避免加载冲突
- 扫描插件注册表:调用
QgsPluginRegistry.instance().scanPlugins()让QGIS检测到新安装的插件 - 加载并激活插件:通过
loadPlugin()和startPlugin()完成插件的加载与激活流程 - 刷新界面动作:调用
iface.reloadPluginActions()刷新QGIS界面,让插件的按钮、菜单立即显示
修改后,插件安装完成后会立即在当前QGIS会话中激活并展示相关UI元素,无需重启软件。
内容的提问来源于stack exchange,提问作者Musashi17




