2011-08-26 18 views
12

¿Existe alguna manera de crear un segundo terminal para que todas las llamadas a las funciones curses funcionen en ese lugar, en lugar de en el terminal existente? Trabajo mucho más rápido cuando puedo probar cosas de forma interactiva, por lo que me gustaría poder ejecutar un intérprete de python interactivo en una terminal y ver el resultado de las maldiciones en otra.¿Hay alguna manera de programar de forma interactiva una aplicación Python curses?

Como está, llamar al initscr() en una ventana interactiva falla (PyDev) o quita permanentemente la actualización de la ventana del host (Spyder) o causa un comportamiento extraño en la consola (IPython).

¿Es posible hacerse cargo de un terminal diferente usando setupterm()? Si es así, ¿dónde obtengo una cadena diferente TERM para llamarla?

Respuesta

3

no creo por lo que el módulo de maldiciones es en su mayoría (en total?) Implementado en el C nivel. Es poco probable que proporcione tales anzuelos, aunque si está familiarizado con el idioma, podría valer la pena buscar a través de la fuente.

Sin embargo, mientras leía su pregunta pensé en otra técnica que uso en otros contextos. Puede guardar un script a través de otro terminal/editor y utilizar una técnica similar al comando dnotify (o incluso un simple sondeo) para cargarlo en su programa en ejecución.

Otra idea sería usar sockets para enviar comandos y ejecutarlos. Por supuesto, esto es peligroso en cuanto a seguridad, así que tome las precauciones necesarias.

Tendrá que construir algo de infraestructura, pero probablemente sea mucho más fácil que agregar compatibilidad de dispositivos múltiples a las maldiciones.

1

Bueno, no estoy seguro de entender completamente lo que estás tratando de hacer. Pero lo que he entendido es que desea tener una consola de python estándar donde pueda escribir su código de forma dinámica. Pero cuando llamas, por ejemplo, una función, la salida del procesamiento de esta función aparecerá en otra terminal.

Bueno ... para que funcione, creo que la arquitectura a utilizar sería un "cliente-servidor".

Como un proceso tiene una stdout y una stderr, y en una arquitectura de multiprocesamiento, puede usar stderr como la tubería de salida de la función. Pero el problema es inicializar el otro terminal que está separado del principal. (no se superpone dentro del mismo espacio).

Si su programa principal Inicializa un servidor (en otro proceso de Python, debido a la propia naturaleza de un servidor) que envía la salida a todos los clientes conectados a él. De esta forma, podría visualizar la salida de la función en varios clientes terminales y/u otra computadora que pueda conectarse a su servidor.

Es, en mi opinión, mucho más fácil que tratar de usar el paquete 'curses'. Pero si el único propósito es obtener una idea de su código, creo que es demasiado complicado (sin valor agregado).


Usted todavía tiene la opción de dumping salida de la función en un archivo de texto (log.txt)

3

Puede usar code.InteractiveConsole y SocketServer para conectar un shell interactivo de python a un socket y hacer su desarrollo a través de eso.Un ejemplo sencillo es así:

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 vez que tenga que en funcionamiento se puede conectar con el puerto 9999 desde otro terminal y hacer su cosa. Puede ver que esto funciona en this screenshot (PNG)

Los conceptos básicos para usar la consola interactiva se tomaron from this post. Lo modifiqué para trabajar con SocketServer para otro proyecto en el que estaba trabajando.

Cuestiones relacionadas