【问题标题】:How to send EOF using scala process utility如何使用 scala 进程实用程序发送 EOF
【发布时间】:2021-06-03 01:42:52
【问题描述】:

我想从一个 scala 程序中启动一个 python 程序,该程序必须接收一个可能无限长的字符串。因此无法将其作为 cmd 参数传递。

我的解决方案是通过标准流传输数据。但是,我找不到工作 bash 代码的 scala 版本:

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

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 代码的输出:

#> scala scala.sc
I am starting to send stuff...
/* and then it never terminates */

【问题讨论】:

  • 不幸的是,它比您想象的要复杂一些。查看this question的答案

标签: python bash scala


【解决方案1】:

#<可以带InputStream所以试试

(cmd #< new ByteArrayInputStream(string.getBytes)).!!

scastie

【讨论】:

  • 是的,效果也不错,而且比我的尝试更简洁。我在底部添加了工作程序。
【解决方案2】:

确实比预期的要复杂一些。但是下面的代码似乎可以工作。

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

}

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 2018-04-28
    • 2013-07-20
    • 2017-12-05
    • 2021-04-03
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多