Python Skript mit subprocess und xterm

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

Hallo zusammen,
zu folgendem Code habe ich eine Frage.

Code: Alles auswählen

import subprocess

#def t():
    #print("Befehl t wird ausgeführt")
    #befehl = "t"
def a5():
    print("Befehl a5 wird ausgeführt")

menu = [
["Befehl1", "t"],
["Befehl2", a5]
]
def handle_menu(menu):
    #while True:
        for index, item in enumerate(menu, 1):
            print("{}  {}".format(index, item[0]))
        choice = int(input("Ihre Wahl? ")) - 1
        if 0 <= choice < len(menu):
            #print (menu[choice][1]())
            auswahl = menu[choice][1]
            procs1 = subprocess.Popen(["xterm", "-e", 'tail -f /tmp/icoms/cosyd.log'])
            procs2 = subprocess.Popen(["xterm", "-e", "nc -u localhost 28070", auswahl])
            procs1.wait()
            procs2.wait()

            print (auswahl)
        else:
            print("Bitte nur Zahlen im Bereich 1 - {} eingeben".format(len(menu)))
handle_menu(menu)
das Skript funktioniert soweit ich möchte nur noch das bei Procs2 (subprocess.Popen(["xterm", "-e", "nc -u localhost 28070", auswahl])) erst "xterm", "-e", "nc -u localhost 28070 ausgeführt wird und in dem Fenster was sich dann öffnet soll die "auswahl" ausgeführt werden.

Aktuelle Fehlermeldung: Can´t execp nc -u localhost 28070: Datei oder Verzeichnis nicht gefunden.

Kann mir jemand helfen wie ich das am besten umsetzte?

Gruß
Rosi
Zuletzt geändert von rosi119 am Donnerstag 2. August 2018, 13:17, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum soll denn da ein xterm gestartet werden? Das braucht es doch gar nicht. starte einfach direkt nc. Mal abgesehen davon, dass es nicht schwer ist, in Python einfach selbst einen UDP-Socket zu oeffnen, und die Daten da selbst abzugreifen. Und erst recht gilt das fuer das tail - du kannst doch einfach die csyd.log-Datei selbst oeffnen, und daraus lesen?

Und du kannst in in dem sich oeffnenden xterm Fenster danach auch nichts mehr ausfuehren. Erst recht keinen Python-Code.

Beschreib doch mal, was die ganze Chose eigentlich fuer ein Problem loesen soll?
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

Es gibt eine Menge befehle die man bei netcat eingeben kann und diese sollen in einem Menü zusammen gefasst werden, dadurch soll man nur noch eine Zahl eingeben und der Befehl wird ausgefürt. Dadurch wird dann die richtige Information aus dem Logfile gezogen.
Benutzeravatar
__blackjack__
User
Beiträge: 14019
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rosi119: Also mir ist aus der Frage und dem Code nicht klar was da passieren soll. `auswahl` kann mal eine Zeichenkette und mal eine Funktion sein. Das ist schon mal komisch. Und an der Stelle wo Du `auswahl` dann beim Aufruf von ``xterm`` geschrieben hast, erwartet ``xterm`` laut Dokumentation die Shell die *in* dem ``xterm`` ausgeführt werden soll. Also beispielsweise 'bash', oder 'fish', oder auch 'python'. Das beisst sich dann aber mit dem `-e`-Argument.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

wie im Beispiel ist Befehl1 z.B. ein t und dieses t soll dann an nc übergeben werden. Das ist so konfiguriert, das dann eine Tabelle ausgegeben wird aus dem Logfile.

Also Auswahl sind immer Befehle die an nc geben werden
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie gesagt, wenn man in Python programmiert, kann man auch direkt mit einem Socket arbeiten, statt da ueber netcat zu gehen. Ob das die bessere Wahl waere, haengt dann ein bisschen davon ab, was konkret denn diese netcat Befehle sind, die da verwandt werden sollen.

Und selbst wenn man nc benutzt, sehe ich noch nicht, wozu denn ein xterm gestartet wird. Wenn du direkt nc startest, kannst du von dem Popen-Objekt die Ausgabe auch direkt abgreifen, und zB weiter verarbeiten. Wenn das Sinn und Zweck von a5 sein sollte. Das ist mir immer noch unklar.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kannst du mal die kompletten nc Befehlszeilen hinschreiben, die jeweils aus der Auswahl 1 und 2 erzeugt werden sollen? Also was wuerdest du selbst im Terminal eingeben?
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

Als Beispiel wenn man a5 eingibt wird z.B. der Audioverkehr ausgeben. Dadurch kann man bestimmte Teile aus dem Logfile ziehen.
xterm muss nicht extra gestartet werden, das stimmt. :P
Zuletzt geändert von rosi119 am Donnerstag 2. August 2018, 13:24, insgesamt 2-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also in meiner man-page zu netcat steht nichts von einem Parameter a5, und auch nichts zu audio-Verkehr. Ich glaube da musst du noch ein bisschen weiter ausholen.
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

Sobald man folgendes eingibt nc -u localhost 28070 ist nc gestartet und dann gibt man nur noch den gewünschten Befehl ein z.B. t oder a5 hier und dann erscheint die Info aus dem Logfile.
Das sind definierte "Debug-Commands"

und um diese Commands auszuführen gibt man erst ein:

tail -f xxx.log ein

und in einem 2 Fenster :

netcat -u localhost 28070

dann erscheint eine cmd wo man die entsprechenden Befehle eingibt, danach wird dann die Information angzeigt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst wirklich ein bisschen besser erklaeren. Du nimmst hier sehr viel Wissen an, dass keiner von uns haben kann, weil wir dein Problem nicht kennen. So wie das klingt, verbindest du dich mit netcat mit einem SERVER irgendeiner Art, und DER versteht dann Kommandos wie t oder a5? Wenn ja, dann sind das keine Befehle von netcat, sondern Befehle von deinem Server.

Und auch da gilt: da musst du kein netcat benutzten, da kannst du auch einfach einen UDP-socket selbst in Python aufmachen, und mit socket.send("a5\n") etc direkt kommunizieren. Und dann von dem Socket die Ergebnisse lesen, oder halt aus einer log-Datei. Die dann wohl zu dem server gehoert?

Wie gesagt - sowas zu erraten ist etwas bloed. Es waere schoen, wenn du da etwas umfassender ausholst um das zu erklaeren, was da wie ineinander greift.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du bei deinem nc-Ansatz bleiben willst, dann musst du statt irgendwas hinter das Kommando zu schreiben mit dem nc-Prozess kommunizieren, via Standardeingabe.

Das geht auch mit subprocess:

Code: Alles auswählen

p = subprocess.Popen(["nc", ... ], stdin=subprocess.PIPE)
p.stdin.write("a5\n")
p.wait()
Aber wie gesagt, ich wuerde das eigentlich mit einem socket machen:

Code: Alles auswählen

import socket
UDP_IP = "127.0.0.1"
UDP_PORT = 28070
sock = socket.socket(socket.AF_INET, # Internet
                      socket.SOCK_DGRAM) # UDP
sock.sendto("a5\n", (UDP_IP, UDP_PORT))
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

@__deets__: Besten dank <3, es hat geklappt.
Mit der nc Methode.
Antworten