与另一个进程的stdin通信时出现意外结果

时间:2016-02-03 13:51:58

标签: java python bash pipe ipc

我的项目目录下面有3个文件。

rndbet / rndbet.py

while True:
    s = input()
    if s == "exit":
        exit()
    else:
        print("I'm rndbet: " + s)

rndbet /开始

python3 rndbet.py

mjhd.java

import java.io.PrintStream;
import java.util.Scanner;

public class mjhd {
    public static void main(String[] args) throws Exception {
        Process process = new ProcessBuilder("bash", "-c", "cd rndbet&&./start").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                Scanner in = new Scanner(process.getInputStream());
                while (in.hasNextLine()) {
                    System.out.println("<- rndbet: " + in.nextLine());
                }
            }
        }).start();
        Scanner in = new Scanner(System.in);
        PrintStream out = new PrintStream(process.getOutputStream(), true);
        while (true) {
            out.println(in.nextLine());
        } //this part is actually broken; it shouldn't be an infinite loop
          //just for testing
    }
}

当我直接从命令行输入bash -c "cd rndbet&&./start"时,会发生以下情况。

$ bash -c "cd rndbet&&./start"
hi
I'm rndbet: hi
exit

但是运行java程序的行为有所不同。

$ java mjhd
hi
<- rndbet: I'm rndbet: hi
exit
<- rndbet: I'm rndbet: exit
exit
<- rndbet: I'm rndbet: exit

所以现在Python脚本没有正确获取exit命令。请帮我解决这个问题。

我刚刚发现一个问题,当Python脚本通过Java运行时,ASCII值13的额外字符总是附加在发送文本的末尾。什么是可能的解决办法?

1 个答案:

答案 0 :(得分:0)

好的,我找到了一个简单的答案。

out.println(in.nextLine());更改为out.print(in.nextLine() + '\n')有效。