Как автоматически перезагрузить плагин после установки в скрипте start.pyPython

Программы на Python
Anonymous
Как автоматически перезагрузить плагин после установки в скрипте start.py

Сообщение Anonymous »

В моем сценарии start.py я запускаю код для установки плагина на основе zip-файла, и плагин успешно извлекается по пути, по которому QGIS ищет плагины.
Во время того же сеанса QGIS кнопка для плагина не отображается, и на основе qgis.utils.active_plugins кажется, что плагин еще не активен. Когда я закрываю текущий сеанс QGIS и открываю новый сеанс QGIS, плагин теперь активен и отображается в виде кнопки.
Однако для пользователя было бы меньше путаницы, если бы плагин просто уже был показан, поскольку я записываю в журнал сообщения о том, что плагин установлен. Поэтому некоторые пользователи могут начать искать плагин, хотя он еще недоступен.

Существуют ли функции PyQgis, которые автоматически обновляют активные плагины и перезагружают плагины?
Ниже приведен мой текущий скрипт start.py
from qgis.utils import iface
from PyQt5.QtCore import QTimer
from qgis.PyQt.QtCore import QSettings, QStandardPaths
from qgis.core import QgsMessageLog, Qgis
import zipfile
import os
import shutil

# Automatically detect the user's home directory
USER_HOME = os.path.expanduser("~")

# Folder containing the ZIP files
LOCAL_ZIP_FOLDER = os.path.join(
USER_HOME,
"Programs",
"QGIS 3.40.8",
"plugins",
"Standaard actief"
)

# Plugins to install
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"ZIP not found for {plugin_name}", "Startup", Qgis.Warning)
return False

if os.path.isdir(target_dir):
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"Error extracting {plugin_name}: {e}", "Startup", Qgis.Critical)
return False

def install():
QgsMessageLog.logMessage("Local ZIP plugin installer started", "Startup", Qgis.Info)
QgsMessageLog.logMessage(f"Installing into: {plugin_dir()}", "Startup", Qgis.Info)

for plugin in PLUGIN_LIST:
QgsMessageLog.logMessage(f"Installing {plugin} from ZIP", "Startup", Qgis.Info)

if install_from_zip(plugin):
QgsMessageLog.logMessage(f"{plugin} installed", "Startup", Qgis.Success)
else:
QgsMessageLog.logMessage(f"{plugin} failed to install", "Startup", Qgis.Warning)

def delayed_start():
QTimer.singleShot(5000, install)

iface.initializationCompleted.connect(delayed_start)

Вернуться в «Python»