2011-10-27 18 views
5

Intro

ho armeggiare con Twisted negli ultimi giorni, dopo aver raccolto pitone meno di un mese fa. La mia prima inclinazione era giocare con qualcosa che conosco e uso ogni giorno, IRC. Ho ottenuto una connessione IRC di base attiva e funzionante grazie all'esempio ircLogBot.py.carico/ricaricare una porzione di codice in Python senza riavviare script principale

Domanda

voglio avere un po 'di codice arbitrario che viene eseguito ogni volta che un evento IRC (PRIVMSG/CTCP/entrata /) viene ricevuto, e per scopi di debugging mi piacerebbe essere in grado di apportare modifiche al quel pezzo di codice e poi ricaricarlo senza chiudere l'intero script e riconnettersi al server IRC.

Note Finali

Non deve essere una soluzione che incorpora Contorto, come non comprendere appieno ancora. Anche se presumo che questo sia il tipo di cosa che si è distorta, essendo un framework basato sugli eventi, è probabile che sia progettato per fare bene.

risposta

3

Pianificare un evento ricorrente (ogni pochi secondi) per ricaricare il modulo in fase di debug. Utilizzare la funzione integrata reload() per questo scopo.

Si potrebbe volerlo racchiudere in un tentativo/tranne per gestire il caso in cui si introduce un errore nel modulo in fase di debug. Ciò manterrà vivo il server di fronte agli errori :-)

+0

Accettato! Non pensavo di usare moduli del genere. – frontendloader

+0

Assicuratevi di leggere [reload's docs] (http: //docs.python.org/library/functions.html # reload), ciò che fa non è troppo intuitivo. –

2

Si potrebbe voler dare un'occhiata a 'livecoding' che gestisce il caricamento del codice; potrebbe soddisfare le tue esigenze. Si noti, tuttavia, che "livecoding" richiede i file di codice (cartelle) per seguire le proprie convenzioni che non sono necessariamente pitoni.

Un'altra possibilità è quella di eseguire il rollover del proprio sistema utilizzando reload, come suggerito da Raymond. Se il tuo codice è ben distaccato dai tuoi dati di stato, potrebbe essere facile da implementare.

0

Esegui nell'interprete interattivo. Puoi iniziare un thread in background e sei ancora in modalità interattiva. Quindi puoi ricaricare come desiderato. Questo ti dà più controllo di averlo automaticamente su un timer.

Ho utilizzato occasionalmente l'avvio dell'intero server aziendale in modalità interattiva.

9

Twisted ha alcune funzionalità incorporate in twisted.python.rebuild che fornisce un'implementazione più completa della funzione integrata di Python reload. Ci sono ancora alcune limitazioni, ma la sua principale differenza dalla ricarica integrata di Python è che troverà vecchie istanze di oggetti e sostituirà le loro classi con la nuova versione. (Il limite principale è che devi essere consapevole del fatto che le tue istanze potrebbero avere lo stato precedente che non corrisponde alla versione corrente di __init__, se lo hai cambiato, che è ciò che è rebuild.Sensitive.)

Se vuoi creare qualcosa di veramente creativo e automatico, puoi configurare un monitor del file system che rileva quando i file cambiano e ricarica i moduli associati con la ricostruzione quando cambia. Su Linux, è possibile utilizzare il supporto di Twisted inotify per le notifiche di modifica e su OS X, è possibile utilizzare cfreactor insieme all'API FSEventsvia PyObjC. (Non so quali schemi di monitoraggio di alterazione del file funzionino su win32 ma potrebbe essere possibile anche lì.)