2011-08-26 13 views
12

C'è un modo per creare un secondo terminale in modo che tutte le chiamate alle funzioni curses funzionino su quello, piuttosto che nel terminale esistente? Lavoro molto più velocemente quando posso provare le cose in modo interattivo, quindi mi piacerebbe essere in grado di eseguire un interprete python interattivo in un terminale e vedere l'output di curses in un altro.Esiste un modo per programmare interattivamente un'applicazione Python per le maledizioni?

Allo stato attuale, chiamare initscr() in una finestra interattiva non riesce (PyDev) o elimina in modo permanente l'aggiornamento della finestra dall'host (Spyder) o provoca un comportamento strano nella console (IPython).

È possibile rilevare un altro terminale utilizzando setupterm()? In tal caso, dove posso ottenere una stringa TERM diversa con cui chiamarla?

risposta

3

Non credo così come il modulo curses è per lo più (del tutto?) Implementata a C livello. È improbabile che possa fornire tali ganci, sebbene se si abbia familiarità con la lingua potrebbe valere la pena guardare attraverso la fonte.

Tuttavia mentre leggevo la tua domanda ho pensato ad un'altra tecnica che uso in altri contesti. È possibile salvare uno script tramite un altro terminale/editor e utilizzare una tecnica simile al comando dnotify (o anche un semplice polling) per caricarlo nel programma in esecuzione.

Un'altra idea sarebbe utilizzare gli zoccoli per inviare comandi ed eseguirli. Naturalmente questo è pericoloso per la sicurezza, quindi prendi le precauzioni necessarie.

Dovrai creare un'infrastruttura, ma sarebbe probabilmente molto più semplice dell'aggiunta di più dispositivi di supporto alle maledizioni.

1

Beh, non sono sicuro di aver capito completamente quello che stai cercando di fare. Ma quello che ho capito è che vuoi avere una console python standard in cui puoi digitare il tuo codice in modo dinamico. Ma quando chiamate, per esempio, una funzione, l'output dell'elaborazione di questa funzione apparirebbe in un altro terminale?

Bene ... perché funzioni, penso che l'architettura da utilizzare sia un "client-server".

Poiché un processo ha uno stderr e uno stderr e in un'architettura multiprocessing è possibile utilizzare lo stderr come pipe di output della funzione. Ma il problema sta inizializzando l'altro terminale che è separato da quello principale. (nessuna sovrapposizione all'interno dello stesso spazio).

Se il programma principale Inizializza un server (su un altro processo Python, a causa della natura stessa di un server) che invia l'output a tutto il client ad esso collegato. In questo modo è possibile visualizzare l'output della funzione su diversi client terminal e/o su un altro computer in grado di connettersi al server.

È, a mio parere, molto più semplice che provare a utilizzare il pacchetto "curses". Ma se l'unico scopo è ottenere una comprensione del tuo codice, penso che sia complicato (nessun valore aggiunto).


Hai ancora la possibilità di scarico in uscita della funzione in un file di testo (log.txt)

3

È possibile utilizzare il codice.InteractiveConsole e SocketServer per collegare una shell interattiva python a un socket ed eseguire il relativo sviluppo.Un semplice esempio si presenta come:

import sys 
import SocketServer 
from code import InteractiveConsole 

class InteractiveServer(SocketServer.BaseRequestHandler): 
    def handle(self): 
     file = self.request.makefile() 
     shell = Shell(file) 
     try: 
      shell.interact() 
     except SystemExit: 
      pass 


class Shell(InteractiveConsole): 
    def __init__(self, file): 
     self.file = sys.stdout = file 
     InteractiveConsole.__init__(self) 
     return 

    def write(self, data): 
     self.file.write(data) 
     self.file.flush() 

    def raw_input(self, prompt=""): 
     self.write(prompt) 
     return self.file.readline() 

if __name__ == '__main__': 
    HOST, PORT = "0.0.0.0", 9999 

    server = SocketServer.TCPServer((HOST, PORT), InteractiveServer) 
    server.serve_forever() 

Una volta che hai installato e funzionante che è possibile connettersi alla porta 9999 da un altro terminale e fare la tua cosa. Puoi vedere che funziona in this screenshot (PNG)

Le basi per l'utilizzo di InteractiveConsole sono state prese from this post. L'ho modificato per funzionare con SocketServer per un altro progetto su cui stavo lavorando.

Problemi correlati