Ich habe einen externen Prozess, den ich gerne behandeln würde
Funktion von String=>String
. Wenn eine Eingabezeile eingegeben wird, antwortet sie mit einer einzigen Ausgabezeile. Es scheint, dass ich verwenden sollte
scala.sys.process, das ist eindeutig eine elegante Bibliothek, die viele macht
Shell-Operationen leicht zugänglich innerhalb von Scala. Wie auch immer, ich
kann nicht herausfinden, wie man diesen einfachen Anwendungsfall durchführt.
Wenn ich eine Zeile in den Prozess 'stdin' schreibe, wird das Ergebnis ausgegeben
in einer einzigen Zeile. Wie kann ich sys.process
verwenden, um einen Wrapper zu erstellen, damit ich
kann den Prozess interaktiv nutzen? Zum Beispiel, wenn ich eine hatte
Implementierung für ProcessWrapper
, hier ist ein Programm und es wird ausgegeben:
Ausgabe:
%Vor% Es ist wichtig, dass der Prozess nicht für jeden Aufruf von process
neu geladen wird, da ein wichtiger Initialisierungsschritt vorliegt.
Also - nach meinem Kommentar - das wäre meine Lösung
%Vor%Der Hauptteil ist der StreamRunnable, wo der Prozess in einem Thread gelesen wird und die empfangene Zeile an einen "LineListener" (eine einfache String = & gt; Unit - Funktion) weitergegeben wird. Das wichtigste ist nur eine Beispiel-Implementierung - Aufruf von Python;)
Wie wäre es mit einem Akka-Schauspieler? Der Akteur kann einen Zustand und somit einen Verweis auf ein offenes Programm (in einem Thread) haben. Sie können Nachrichten an diesen Akteur senden.
ProcessWrapper ist möglicherweise selbst ein typisierter Akteur oder nur etwas, das die Aufrufe einer Funktion in einen Aufruf eines Akteurs umwandelt. Wenn Sie nur als Methodenname 'verarbeiten', dann wäre wrapper ! "message"
genug.
Wenn ein Programm geöffnet und zum Empfang von Befehlen bereit ist, klingt es wie ein Schauspieler, der Nachrichten empfängt.
Edit: Wahrscheinlich habe ich die Anforderungen falsch verstanden. Sie möchten mehrere Zeilen an denselben Prozess senden. Das ist mit der folgenden Lösung nicht möglich.
Eine Möglichkeit wäre, dem ProcessBuilder
eine Erweiterungsmethode hinzuzufügen, die es ermöglicht, die Eingabe von einer Zeichenfolge zu übernehmen:
Sie können jetzt die Methode wie folgt verwenden:
%Vor% Beachten Sie, dass die Typannotation notwendig ist, weil wir zwei Konvertierungen benötigen ( String
- & gt; ProcessBuilder
- & gt; ProcessBuilderWithStringInput
, und Scala nur automatisch eine Konvertierung anwendet.
Tags und Links scala