You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动