Risoluzione dei problemi¶
Il log diagnostico dell'editor contiene ogni riga rilevante. Su Windows si trova
in %LOCALAPPDATA%/MTE/log/. Guarda il file più recente dopo aver avviato
l'editor.
«Python plugins disabled»¶
Quattro varianti; il messaggio esatto ti dice quale.
PluginHost: MTE_PYTHON is not set; falling back to PATH.¶
Neutro: l'host sta per cercare Python nel PATH. Va bene, a meno che non sia
seguito da «no Python interpreter found».
PluginHost: MTE_PYTHON path '<value>' does not exist.¶
Hai impostato MTE_PYTHON su un percorso con un separatore di cartella, ma il
file a quel percorso manca. Rimedio: puntalo al vero python.exe.
PluginHost: MTE_PYTHON='<name>' not found on PATH.¶
Hai impostato MTE_PYTHON su un nome nudo (senza separatore), ma quel nome non è
nel PATH. Rimedio: aggiungi la cartella al PATH oppure usa la forma con
percorso completo qui sopra.
PluginHost: no Python interpreter found (…); Python plugins disabled.¶
Né MTE_PYTHON né alcuno dei nomi standard della piattaforma (py.exe,
python.exe, python3.exe su Windows; python3 su macOS/Linux) è nel PATH.
Installa Python 3.9+ e aggiungilo al PATH oppure imposta MTE_PYTHON.
Verifica che cosa vede attualmente il PATH, dalla stessa shell da cui hai
avviato l'editor:
(Get-Command py.exe -ErrorAction SilentlyContinue).Source
(Get-Command python.exe -ErrorAction SilentlyContinue).Source
«python worker script … not found»¶
L'editor registra nel log:
Lo script host del worker (mte_python_host.py) non è accanto all'eseguibile.
Succede quando si esegue una build dell'editor in cui il passo POST_BUILD di
predisposizione di Python/ è stato saltato. Ricompila:
Conferma che il file esista dopo la compilazione:
Plugin elencato ma non caricato¶
Apri la pagina delle estensioni (Preferenze → Estensioni). Cause comuni:
| Sintomo | Riga nel log | Causa |
|---|---|---|
Etichetta di discordanza di apiVersion accanto al nome |
PythonPluginBackend: not loading '…': apiVersion does not match host 1. |
Il tuo plugin.json dichiara una apiVersion diversa da quella che l'editor in esecuzione supporta. |
| Il plugin appare disattivato | PythonPluginBackend: '…' is disabled; listed but not loaded. |
Qualcuno l'ha disabilitato nella pagina Plugin. Riabilitalo e riavvia. |
| Del tutto assente | PythonPluginBackend: skipping '…': module '…/main.py' does not declare a top-level 'def register(...)'. |
La sonda statica ha respinto il tuo modulo. Sposta register al primo livello (colonna 0). |
| Del tutto assente | PythonPluginBackend: skipping '…': module file '…' is missing or unreadable. |
plugin.json.module è "main" ma non c'è alcun main.py accanto. |
| Del tutto assente | PythonPluginBackend: skipping '…': plugin.json missing required field 'id'. |
Aggiungi id. |
Il comando non scatta¶
Hai cliccato la voce di menu / premuto la scorciatoia ma non è successo nulla.
- Controlla se ci sono righe
[python:<your.id>] …prodotte dal tuoctx.log.info(...). Se mancano, la callback non ha mai raggiunto il worker. - Controlla se ci sono righe
[worker stderr] …. Le eccezioni dentro la tua callback finiscono lì. - Conferma che l'id del comando nella tua chiamata
add_itemcorrisponda alla lettera al tuocommand(id=...): il confronto tra stringhe è esatto.
Errori «worker died»¶
L'host registra nel log:
Il sottoprocesso Python si è concluso. Cerca sopra quella riga lo stderr del
worker: Python stampa le tracce su stderr e l'host le inoltra come
[worker stderr] …. Un crash corrisponde quasi sempre a un'eccezione non
catturata in register() oppure in una callback che è rientrata ricorsivamente
nell'API C di Python.
Riprenditi correggendo il codice e riavviando l'editor. L'host non riavvia automaticamente un worker andato in crash.
Predisposizione del venv fallita (plugin elencato ma non caricato)¶
Un plugin che dichiara pyRequires ottiene un ambiente virtuale predisposto al
primo avvio. Quando quello fallisce, il log ne riporta il motivo:
PluginHost: 'org.example.x' needs a venv (no venv provisioned yet).
PythonRuntime: provisioning venv at '...' (1 requirement(s)); ...
PluginHost: venv provisioning for 'org.example.x' failed: pip install
failed: ... No matching distribution found for no-such-package ...
Cause comuni: nessuna rete al primo avvio, un requisito scritto male, un
pacchetto senza wheel per la versione di Python dell'utente. Correggi la causa e
riavvia: la predisposizione riprova a ogni lancio finché non riesce (il venv
viene marcato come completo solo alla fine). Per forzare una ricostruzione
pulita, elimina <AppLocalData>/PluginVenv/<plugin-id>/. Le macchine offline
possono invece distribuire un venv/ precostruito dentro il pacchetto — vedi
Creazione dei pacchetti.
L'installer ha rifiutato il mio .mteplugin¶
Ogni rifiuto arriva con un messaggio di finestra specifico; i più comuni:
| Il messaggio dice… | Rimedio |
|---|---|
manca il campo obbligatorio 'module' |
Aggiungi "module": "main" a plugin.json. |
| nessun modulo Python (file .py) | L'archivio non ha alcun .py: hai compresso la cartella giusta? |
non contiene il modulo Python dichiarato 'X.py' |
module in plugin.json non corrisponde al nome del file nell'archivio. |
non dichiara un def register(...) di primo livello |
Stessa regola dell'individuazione: def register( deve iniziare alla colonna 0 di <module>.py. |
| punta alla versione N dell'API | Ricompila per l'apiVersion corrente (vedi plugin.json). |
| percorso non sicuro / troppo grande / troppi file | L'archivio ha fatto scattare una protezione — reimpacchettalo in modo semplice (nessuna voce .., < 256 MiB una volta estratto). |
Il pacchetto viene validato su una copia temporanea, quindi un'installazione rifiutata non tocca mai un plugin esistente.
Non viene registrato proprio nulla nel log¶
Conferma che il tuo gestore sia davvero installato. register(ctx) viene
eseguito esattamente una volta per plugin a ogni lancio dell'editor. Se
register non è definito al primo livello del modulo, la sonda statica respinge
il plugin prima ancora che venga caricato (vedi «Plugin elencato ma non caricato»
qui sopra).
Aggiungi una riga di avvio al tuo register:
Se non la vedi nel log, il worker non sta eseguendo il tuo register: cerca il
motivo nelle righe di log precedenti.
Dove guardare poi¶
- Log lato editor:
%LOCALAPPDATA%/MTE/log/… - stderr del worker: lo stesso log, con l'etichetta
[worker stderr] - Documentazione: API
ctx, Eventi,plugin.json - Note di progettazione:
PYTHON_PLUGIN_ARCHITECTURE.md(radice del repository)