Sto creando un'app wxpython che compilerò con le varie utilità di congelamento disponibili per creare un eseguibile per più piattaforme.Python - Creazione di un sistema "scripting"
il programma sarà un editer mappa per una tile-based motore di gioco
in questa app voglio fornire un sistema di scripting in modo che gli utenti avanzati possono modificare il comportamento del programma, come la modifica dei dati di progetto, l'esportazione il progetto in un formato diverso ecc.
Voglio che il sistema funzioni in questo modo.
l'utente posizionerà lo script python che desidera eseguire in una casella di testo stile e quindi premere un pulsante per eseguire lo script.
Sto bene con questo finora questo è tutto molto semplice. ottenere lo script dalla casella di testo come una stringa compilarlo a un oggetto di merluzzo con la funzione di compilazione integrato() quindi eseguire lo script con uno statment exec
script = textbox.text #bla bla store the string
code = compile(script, "script", "exec") #make the code object
eval(code, globals())
la cosa è, voglio fare in modo che questa funzione non può causare errori o errori
dire se c'è una dichiarazione di importazione nello script. questo causerà problemi tenendo conto che il codice è stato compilato con qualcosa come py2exe o py2app?
Come faccio a essere sicuro che l'utente non possa interrompere la parte critica del programma come modificare parte della GUI consentendo comunque loro di modificare i dati del progetto (i dati sono conservati in proprietà globali nel proprio modulo)? Penso che ciò significherebbe modificare il ditt globale che viene passato alla funzione eval.
come assicurarsi che questo errore non possa causare il blocco del programma a causa di un ciclo lungo o infinito? come faccio a essere sicuro che un errore generato nel codice dell'utente non possa bloccare l'intera app?
In sostanza, come evitare tutti i problemi che possono sorgere quando si consente all'utente di eseguire il proprio codice?
EDIT: Per quanto riguarda le risposte date
non mi sento come una delle risposte finora hanno davvero risposto alle mie domande sì sono stati in parte risposto, ma non completamente. Sono ben consapevole dell'impossibilità di arrestare completamente il codice non sicuro. le persone sono semplicemente troppo intelligenti per un uomo (o persino un teem) per pensare a tutti i modi per aggirare un sistema di sicurezza e prevenirli.
in effetti non mi interessa davvero se lo fanno. Sono più preoccupato per qualcuno che rompe involontariamente qualcosa che non sapevano. se qualcuno volesse davvero, potrebbe strappare l'app a brandelli con la funzionalità di scripting, ma non me ne potrebbe importare di meno. sarà la loro istanza e tutti i problemi che creeranno spariranno quando riavviano l'app, a meno che non abbiano incasinato i file sull'HD. Voglio prevenire i problemi che sorgono quando l'utente dosa qualcosa di stupido.
cose come IOError's, SystaxErrors, InfiniteLoopErrors ect.
ora è stata data una risposta alla parte riguardante lo scope. Ora capisco come definire quali funzioni e globali sono accessibili dalla funzione eval
ma c'è un modo per assicurarsi che l'esecuzione del loro codice possa essere interrotta se impiega troppo tempo?
un sistema di filo verde forse?(Verde perché sarebbe eval per rendere gli utenti si preoccupano per la sicurezza dei thread)
anche se un utente utilizza un import module
dichiarazione per caricare un modulo da anche la libreria di default che non viene utilizzato nel resto della classe. ciò potrebbe causare problemi con l'applicazione bloccata da Py2exe, Py2app o Freeze? cosa succede se chiamano un modale lato esterno della libreria standard? sarebbe sufficiente che il modale sia presente nella stessa directory dell'eseguibile congelato?
Mi piacerebbe ottenere queste risposte senza creare una nuova domanda, ma lo farò se devo.
Eval è praticamente impossibile da rendere completamente sicuro imo (ma che non essendo la mia principale area di competenza potrei parlare fuori dal mio culo). Perché non seguire lo sviluppo di un'API con una struttura plug-in per questo, se l'ambito di sicurezza/integrazione e funzionalità è un problema? –
Ehi, almeno non è 'exec'. – nmichaels
Per lo meno, riconosci che questo è uno di quei casi veramente rari in cui un gotta-catch-'em-tutti 'tranne: 'ha un senso e lo applica. Non è necessario arrestare l'intera app perché un utente relativamente nuovo di Python ha perso uno spazio. +1 e preferiti, non vedo l'ora di incorporare un REPL Python in una mia app. – delnan