Simulierte Konsole/Shell

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8641
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Simulierte Konsole/Shell

Beitrag von Xin » Do Okt 22, 2020 8:23 pm

Dann werde ich auch mal eine Frage stellen in Vorbereitung für ein Problem, was ich in der nächsten Zeit lösen muss und meine Experimente bisher eher von überschaubaren Erfolg waren. Ansonsten bin ich auch für ein offenes Brainstorming zu haben, wie man an solche Probleme herangehen könnte.

Folgendes Problem: Ich möchte ein Shell-Programm aufrufen und dann mit dem Programm kommunizieren.
Wenn ich einen Compiler aufrufe ("gcc hworld.c") liefert der eine Text-Ausgabe und beendet sich dann. Soweit ist das auch halbwegs nachvollziehbar.
Nun möchte ich mit einem interaktiven Shell-Programm kommunizieren können, zum Beispiel "mysql" oder "python". Ich muss also als aufrufender Task solange Ausgaben des gerufenden Programms lesen, bis dieses entweder aufhört zu senden oder eine erwartete Ausgabe kommt.

Wenn ich also python starte, erzählt es mir etwas ...

Code: Alles auswählen

xin@dualpower:~/xsd/apps/xbuild$ python3
Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
und wartet dann, bis die drei > kommen, um eine Eingabe zu bringen. Nun möchte ich Befehle absetzen, zum Beispiel

Code: Alles auswählen

>>> print (1+2)
3
>>> 
und das Ergebnis herauslesen können.

Und das idealerweise für Posix und Windows.

Mein Problem dabei ist, dass ich nicht gut mitbekomme, wenn der Task nichts mehr sendet. Befehle wie

Code: Alles auswählen

>>> print (">>>")
>>>
>>> 
machen mir hier das Leben schwerer, ich kann also nicht einfach aufhören zu lesen, wenn die gesuchte Zeichenkette da ist.

Hat da jemand schon Erfahrungen gesammelt?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3110
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Simulierte Konsole/Shell

Beitrag von cloidnerux » Do Okt 22, 2020 8:55 pm

Du wirst mit allen Menschenschnittstellen das Problem haben, dass nichts eindeutig ist. Im Endeffekt musst du Heuristisch ran gehen. Alles Einlesen und Zeiten zwischen '\n' abwarten und die Zeit seit der letzen Ausgabe als timeout nutzen.
In der Python-Shell im speziellen kann man natürlich nach dem letzten <Enter> direkt ein Buchstabe senden und warten bis der Eingabepuffer der Konsole das nächste mal gelesen und ausgegeben wird. Dann halt direkt nen <Backspace> hinterher und dein Befehl.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten