Python 如何使用scala process utility发送EOF
我想从scala程序内部启动一个python程序,该程序必须接收可能无限长的字符串。因此,不可能将其作为cmd参数传递 我的解决方案是通过STDStream传输数据。但是,我找不到工作bash代码的scala版本:Python 如何使用scala process utility发送EOF,python,bash,scala,Python,Bash,Scala,我想从scala程序内部启动一个python程序,该程序必须接收可能无限长的字符串。因此,不可能将其作为cmd参数传递 我的解决方案是通过STDStream传输数据。但是,我找不到工作bash代码的scala版本: #/bin/bash var="SOME REALLY LONG STRING THAT IS SEND TO THE PYTHON PROGRAM" echo "$var" | ./readUntilEOF.py bash代码: #/bin
#/bin/bash
var="SOME REALLY LONG STRING THAT IS SEND TO THE PYTHON PROGRAM"
echo "$var" | ./readUntilEOF.py
bash代码:
#/bin/bash
var="SOME REALLY LONG STRING THAT IS SEND TO THE PYTHON PROGRAM"
echo "$var" | ./readUntilEOF.py
scala代码:
import sys.process._
object main {
def main(args : Array[String]) : Unit = {
val cmd = "./readUntilEOF.py"
val string = "SOME REALLY LONG STRING THAT IS SEND TO THE PYTHON PROGRAM"
print("I am starting to send stuff...")
val resultString = (string #| cmd.!!).!!
print(resultString)
}
}
#> scala scala.sc
I am starting to send stuff...
/* and then it never terminates */
readUntilEOF.py:
#!/usr/bin/python3
import sys
if __name__ == "__main__":
read = sys.stdin.read()
print(read)
运行bash命令的输出:
#> ./scalaBashEquivalent.sh
SOME REALLY LONG STRING THAT IS SEND TO THE PYTHON PROGRAM
运行scala代码的输出:
import sys.process._
object main {
def main(args : Array[String]) : Unit = {
val cmd = "./readUntilEOF.py"
val string = "SOME REALLY LONG STRING THAT IS SEND TO THE PYTHON PROGRAM"
print("I am starting to send stuff...")
val resultString = (string #| cmd.!!).!!
print(resultString)
}
}
#> scala scala.sc
I am starting to send stuff...
/* and then it never terminates */
这确实比预期的要复杂一些。但下面的代码似乎有效
import java.io.PrintWriter
object main {
def main(args : Array[String]) : Unit = {
val cmd = "./readUntilEOF.py"
val string = "SOME REALLY LONG STRING THAT IS SEND TO THE PYTHON PROGRAM"
println("I am starting to send stuff...")
val processOutput : StringBuilder = new StringBuilder()
val process = Process(cmd).run(new ProcessIO(
in => {
val writer = new PrintWriter(in)
writer.write(string)
writer.close()
},
out => {
processOutput.addAll(scala.io.Source.fromInputStream(out))
out.close()
},
_.close()
))
assert(process.exitValue() == 0)
print(processOutput.toString)
}
}
这确实比预期的要复杂一些。但下面的代码似乎有效
import java.io.PrintWriter
object main {
def main(args : Array[String]) : Unit = {
val cmd = "./readUntilEOF.py"
val string = "SOME REALLY LONG STRING THAT IS SEND TO THE PYTHON PROGRAM"
println("I am starting to send stuff...")
val processOutput : StringBuilder = new StringBuilder()
val process = Process(cmd).run(new ProcessIO(
in => {
val writer = new PrintWriter(in)
writer.write(string)
writer.close()
},
out => {
processOutput.addAll(scala.io.Source.fromInputStream(out))
out.close()
},
_.close()
))
assert(process.exitValue() == 0)
print(processOutput.toString)
}
}
可以接受InputStream
,因此请尝试
(cmd #< new ByteArrayInputStream(string.getBytes)).!!
(cmd#
可以接受输入流
所以请尝试
(cmd #< new ByteArrayInputStream(string.getBytes)).!!
(cmd#
不幸的是,这比你想象的要复杂一些。不幸的是,这个问题的答案比你想象的要复杂得多。请查看“是”的答案,该答案同样有效,并且比我的尝试更详细。我在底部添加了工作程序。是的,它也可以工作,并且比我的尝试更详细。我在底部添加了工作程序。