Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用scala process utility发送EOF_Python_Bash_Scala - Fatal编程技术网

Python 如何使用scala process utility发送EOF

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

我想从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/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#

不幸的是,这比你想象的要复杂一些。不幸的是,这个问题的答案比你想象的要复杂得多。请查看“是”的答案,该答案同样有效,并且比我的尝试更详细。我在底部添加了工作程序。是的,它也可以工作,并且比我的尝试更详细。我在底部添加了工作程序。