sys.process, um einen Prozess als Funktion zu umbrechen

8

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:

%Vor%

Ausgabe:

%Vor%

Es ist wichtig, dass der Prozess nicht für jeden Aufruf von process neu geladen wird, da ein wichtiger Initialisierungsschritt vorliegt.

    
schmmd 30.01.2013, 01:47
quelle

5 Antworten

3

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;)

    
michael_s 11.02.2013, 20:18
quelle
2

Ich bin mir nicht sicher, aber Sie wollen so etwas?

%Vor%

Ergebnis:

%Vor%

Ich denke, PlayCLI ist ein besserer Weg.

    
twillouer 06.02.2013 18:12
quelle
1

Ссылка ist heute auf dieses Thema gestoßen und sieht genau so aus, wie Sie es sich wünschen

    
Michael 30.01.2013 18:09
quelle
1

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.

    
EECOLOR 08.02.2013 07:32
quelle
0

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:

%Vor%

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.

    
mkneissl 30.01.2013 07:37
quelle

Tags und Links