Cómo usar un terminal incrustado en una GUI de PyQt

Existe un entorno y un marco de trabajo existentes a través del terminal Bash alrededor del cual quiero crear una GUI. Lo que tengo en mente es el siguiente flujo:

  • En una sesión Bash, el entorno de marco está configurado. Esto hace que todo, desde variables de entorno hasta autenticaciones, se configure en la sesión.
  • Se ejecuta una secuencia de comandos de Python GUI para envolver la sesión existente y facilitar la ejecución de los pasos posteriores.
  • Aparece la GUI, que muestra en un lado la sesión de Bash en un terminal incorporado y en el otro lado un conjunto de botones correspondientes a varios comandos que pueden ejecutarse en el entorno de marco existente.
  • Los botones se pueden presionar en la GUI y se ejecutan ciertos comandos de Bash. Los resultados de las ejecuciones se muestran en el terminal incorporado.

¿Cuál es una buena manera de abordar la creación de una GUI de este tipo? Me doy cuenta de que la idea de interactuar con el entorno existente podría ser complicada. Si es particularmente complicado, estoy abierto a recrear el entorno en una sesión de la GUI. En cualquier caso, ¿cómo puede interactuar la GUI con el terminal incorporado? ¿Cómo se pueden ejecutar y mostrar los comandos en el terminal incorporado cuando se presionan los botones de la GUI?

Un inicio básico de la GUI (con un terminal incorporado) es el siguiente:

#!/usr/bin/env python #-*- coding:utf-8 -*- import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class embeddedTerminal(QWidget): def __init__(self): QWidget.__init__(self) self.resize(800, 600) self.process = QProcess(self) self.terminal = QWidget(self) layout = QVBoxLayout(self) layout.addWidget(self.terminal) self.process.start( 'xterm', ['-into', str(self.terminal.winId())] ) if __name__ == "__main__": app = QApplication(sys.argv) main = embeddedTerminal() main.show() sys.exit(app.exec_()) 

¿Cómo podría ejecutar, digamos, la top de este terminal incorporado después de presionar un botón en la GUI?

Si tiene que ser un terminal real y un shell real (y no solo aceptar una línea de entrada, ejecutar algún comando y luego mostrar la salida), ¿qué hay de tmux?

Podrías usar algo como tee para devolver la salida a tu progtwig.

Tenga en cuenta que las sesiones de tmux pueden persistir en las ejecuciones de su progtwig, por lo que debería leer cómo funciona y cómo controlarlo.

 #!/usr/bin/env python #-*- coding:utf-8 -*- import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class embeddedTerminal(QWidget): def __init__(self): QWidget.__init__(self) self._processes = [] self.resize(800, 600) self.terminal = QWidget(self) layout = QVBoxLayout(self) layout.addWidget(self.terminal) self._start_process( 'xterm', ['-into', str(self.terminal.winId()), '-e', 'tmux', 'new', '-s', 'my_session'] ) button = QPushButton('List files') layout.addWidget(button) button.clicked.connect(self._list_files) def _start_process(self, prog, args): child = QProcess() self._processes.append(child) child.start(prog, args) def _list_files(self): self._start_process( 'tmux', ['send-keys', '-t', 'my_session:0', 'ls', 'Enter']) if __name__ == "__main__": app = QApplication(sys.argv) main = embeddedTerminal() main.show() sys.exit(app.exec_()) 

Un poco más aquí: https://superuser.com/questions/492266/run-or-send-a-command-to-a-tmux-pane-in-a-running-tmux-session