2016-07-21 2 views
2

Wie kann ich einen Befehl in einem bestimmten Terminalfenster ausführen, das bereits geöffnet ist, mit Python?Einen Befehl in einem bestimmten Terminalfenster ausführen - python

Ich kann einen Befehl in einem neuen Terminal mit Python ausführen, aber ich möchte das vorhandene Terminal wiederverwenden. Und es gibt mehrere Terminals geöffnet. Der Befehl sollte in einem bestimmten Terminal ausgeführt werden.

ZB:

  1. begann ich Prozess A in Klemme1.
  2. Ich töte den Prozess A. (Jetzt Terminal1 ist im Leerlauf)
  3. Ich möchte den Prozess A neu starten und zeigen Sie die Protokollierung/Ausgabe von Prozess A in Terminal1.

Ich benutze Ubuntu.

Gründe, dies zu tun:

  • Um die Protokolle der spezifischen Befehle im selben Terminal zu halten.
  • Trennen der Protokolle mehrerer Anwendungen zu verschiedenen Terminals.
  • pflegt die Protokolle von spezifischen Anwendungen in entsprechenden Anschlüssen
    (Anwendungen getötet und automatisch gestartet mehrmals)
+0

Python-die-Sprache weiß nichts über Terminals; Es hat keine Konstrukte, die hier helfen können. Es gibt ** UNIX ** -Konstrukte, die helfen können, aber sie hängen davon ab, ob Sie entweder bestimmte Software im Terminal ausführen oder auf andere Weise eingreifen (zB indem Sie die PTY-Nummer nachschlagen). Und ehrlich gesagt, keine dieser Techniken ist spezifisch für Python - wir hätten die exakt gleichen Fragen, die wir zuerst beantwortet hätten, wenn Sie sich fragen, wie Sie das in einem Shell-Skript oder von C aus tun. –

+0

Beginnen wir mit einem kleinen Backup: Wie soll Ihre Software das spezifische Terminal identifizieren, an das die Ausgabe gehen soll? (Und warum läuft diese Software nicht * direkt auf dem fraglichen Terminal *?) –

+0

... wenn die Antwort lautet, dass die Software im Hintergrund ausgeführt werden soll, auch wenn Ihr Terminal nicht funktioniert Offen, dann sollten Sie wahrscheinlich seine Ausgabe in eine Datei schreiben, und ein Programm, das in diesem Terminal ausgeführt wird, ist verantwortlich für das Spoolen der Ausgabe von dieser Datei. –

Antwort

0

Meine Lösung ein bisschen kludgy und Sicherheitsfragen hat. Vielleicht kann jemand anderes einen besseren Eintrag machen.

Um einen Befehl in einem offenen Fenster Terminal auszuführen, I ttyecho verwendet (siehe post auf unix.stackexchange). Die Sicherheitsbedenken bei dieser Methode scheinen der Verwendung von shell=True mit subprocess.Popen oder subprocess.run ähnlich zu sein.

Zur Auswahl eines bestimmten offenen Terminals listet der Linux-Befehl ps a Prozesse auf, die mit einem tty verknüpft sind und das tty identifizieren. Ich benutze ein Debian-Derivat, so dass meine offenen Terminals als Prozesse mit einem 'pts/n' (Pseudo-Terminal-Slave) angezeigt werden, wobei n eine ganze Zahl ist, die zwischen verschiedenen Instanzen von offenen Terminals unterscheidet. Zum Beispiel:

PID TTY  STAT TIME COMMAND 
191 tty7  Rsl+ 9:12 /usr/lib/xorg/Xorg :0 -seat seat0 -aut /var/run/ligh 
1049 tty1  Ss+ 0:00 /sbin/agetty --noclear tty1 linux 
1050 ttyS0 Ss+ 0:00 /sbin/agetty ==keep-baud 115200,38400,9600,ttyS0 vt22 
4254 pts/0 Ss  0:00 bash 
4675 pts/1 Ss+ 0:00 bash 
4876 pts/2 Ss+ 0:00 sudo /srv/xxx/main.py 
4878 pts/2 S+  0:01 python3 /srv/xxx/main.py 
5012 pty/0 R+  0:00 ps a 

Unter der Annahme, dass Sie von welchem ​​Terminal Sie ausführen möchten, den Befehl in dem, was bereits läuft im Terminal unterscheiden können, können Sie Python-Code verwenden wie:

import subprocess 
r = subprocess.run(['ps', 'a'], stdout=subprocess.PIPE, universal_newlines=True) 
try: 
    pts = [*(line for line in r.stdout.split('\n') if searchstring in line)][0]=.split(' ')[1][4:] 
except IndexError: 
    pts = None 
if pts: 
    r2 = subprocess.run(['sudo', 'ttyecho', '-n', '/dev/pts/' + pts, command]) 

Ich habe testete dies auf einem rPi running kali (die xfce4-terminal verwendet) mit Python 3.5.

+0

Btw, ich finde das relevant, da ich noch nicht die Zeit damit verbracht habe, eine richtige Python-GUI zu lernen und Unix-Terminals als einfachen Proxy für eine Python-GUI mit mehreren Fenstern zu verwenden. – ucla87

+0

Warum eine zweite Antwort hinzufügen, anstatt Ihre frühere (gelöschte) zu bearbeiten? –

+0

... und btw, was gibt 'ttyecho' dir hier, dass das Auslassen von 'sudo' und das direkte Anhängen von stdin und stdout an das tty (direktes Öffnen aus dem Python-Prozess) nicht funktioniert? (Ja, wenn das Programm versucht, mit '/ dev/tty' zu interagieren, könnte das ein Problem sein, aber die meisten Software * nicht * ... und wie ich es am besten beurteilen kann, hört es sich so an, als würde das OP gerade spoolen Protokolle). –