我开始并运行Scala进程。如何写一个字符串到Scala进程?
val dir = "/path/to/working/dir/"
val stockfish = Process(Seq("wine", dir + "stockfish_8_x32.exe"))
val logger = ProcessLogger(printf("Stdout: %s%n", _))
val stockfishProcess = stockfish.run(logger, connectInput = true)
该进程读取和写入标准IO(控制台)。如何将字符串命令发送到进程,如果它已经启动?
Scala过程API有ProcessBuilder,它反过来一堆有用的方法。但是在之前使用ProcessBuilder 一个进程开始编写复杂的shell命令。另外Scala还有ProcessIO来处理输入或输出。我也不需要它。我只需要发送消息给我的过程。
在Java中,我会做这样的事情。
String dir = "/path/to/working/dir/";
ProcessBuilder builder = new ProcessBuilder("wine", dir + "stockfish_8_x32.exe");
Process process = builder.start();
OutputStream stdin = process.getOutputStream();
InputStream stdout = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
new Thread(() -> {
try {
String line;
while ((line = reader.readLine()) != null) {
System.out.println("Stdout: " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
Thread.sleep(5000); // it's just for example
writer.write("quit"); // send to the process command to stop working
writer.newLine();
writer.flush();
它工作得很好。我开始我的流程,从中获取InputStream和OutputStream,并使用流与流程进行交互。
看来Scala Process trait没有办法写入它。 ProcessBuilder在流程运行后没有用处。而ProcessIO仅用于IO捕获和处理。
有什么方法可以写入Scala运行过程吗?
UPDATE:
我不明白我怎么可以使用ProcessIO将字符串传递到正在运行的进程。 我做了以下。
import scala.io.Source
import scala.sys.process._
object Sample extends App {
def out = (output: java.io.OutputStream) => {
output.flush()
output.close()
}
def in = (input: java.io.InputStream) => {
println("Stdout: " + Source.fromInputStream(input).mkString)
input.close()
}
def go = {
val dir = "/path/to/working/dir/"
val stockfishSeq = Seq("wine", dir + "/stockfish_8_x32.exe")
val pio = new ProcessIO(out, in, err => {})
val stockfish = Process(stockfishSeq)
stockfish.run(pio)
Thread.sleep(5000)
System.out.write("quit\n".getBytes)
pio.writeInput(System.out) // "writeInput" is function "out" which I have passed to conforming ProcessIO instance. I can invoke it from here. It takes OutputStream but where can I obtain it? Here I just pass System.out for example.
}
go
}
当然,它不工作,我不明白如何实现功能,如我在上面的Java代码片段。如果有建议或者Scala代码片段清除我的问题,那将是非常好的。
我想我误解了你的问题,所以我删除了我的回答。你应该指定你正在使用哪个版本的Scala(我认为最近改变了与子流程相关的API)。我很困惑为什么ProcessIO不适合你。看起来你的Java代码只是使用stdin/stdout,这对ProcessIO来说也是可能的。你能澄清吗? – DaoWen
@DaoWen是的,Java中很简单。 Java“Process”类提供了返回可以使用的IO流的方法。 Scala“Process”特征只有三种方法:destroy,exitValue和isAlive。 ProcessIO类具有可直接传递和调用的函数参数“writeInput”。我猜这只是一种对输入事件的倾听,但是如何创建这个“事件”呢?我使用最后一个Scala版本 - 2.12.1。 –