java - Java 和 Python 通过 stdout 进行通信

标签 java python

我有一个通过异步进程调用 Python 的 Java 代码,我希望 Python 进程能够监听 Java 中的 stdout 直到打印出一些内容。

下面是java代码:

import java.io.*;

public class host {
    public static void main(String[] args) throws Exception{
        System.out.println("java starts at " + System.currentTimeMillis() + " ms");
        ProcessBuilder pb = new ProcessBuilder("python","a.py");
        Process tr = pb.start();
        System.out.println("First msg");
        System.out.println("Second msg");
        Thread.sleep(3000);
        System.out.println("x");
        System.out.println("java ends at " + System.currentTimeMillis() + " ms");
    }
}

下面是Python代码:

import sys
import time
if __name__=="__main__":
    fo=open("a.txt","w")
    fo.write('python starts at: %.0f\n'%(time.time()*1000))
    line = sys.stdout.readline()
    while(line != "x\n"):
        fo.write(line+"\n")
        line = sys.stdout.readline()
    fo.write('python ends at: %.0f\n'%(time.time()*1000))
    fo.close()

但是,Python 进程似乎无法从 Java 捕获 stdout。由于我是Java新手,我不确定是否存在根本性错误,以及上述模型是否提供了Java和Python之间通信的有效方式。

编辑(更新)

根据答案/评论,我修改了我的Java代码如下:

import java.io.*;

public class host {
    public static void main(String[] args) throws Exception{
        System.out.println("java starts at " + System.currentTimeMillis() + " ms");
        ProcessBuilder pb = new ProcessBuilder("python","a.py");
        Process tr = pb.start();
        PrintStream ps = new PrintStream(tr.getOutputStream());
        ps.println("First msg"); ps.flush();
        ps.println("Second msg"); ps.flush();
        Thread.sleep(3000);
        ps.println("x"); ps.flush();
        System.out.println("java ends at " + System.currentTimeMillis() + " ms");
    }
}

并更改了 python 脚本如下:

import sys
import time
if __name__=="__main__":
    fo=open("a.txt","w")
    fo.write('python starts at: %.0f\n'%(time.time()*1000))
    line = sys.stdin.readline()
    while(line != "x\n"):
        fo.write(line+"\n")
        line = sys.stdin.readline()
    fo.write('python ends at: %.0f\n'%(time.time()*1000))
    fo.close()

以下是输出:

python starts at: 1453263858103
First msg

First msg

Second msg

python ends at: 1453263863103

最佳答案

接收进程应该监听标准输入,而不是标准输出。

然后将输出从 java 传输到 python:

java -jar myjava.jar | java -jar myjava.jar | python mylistener

关于java - Java 和 Python 通过 stdout 进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34888082/

相关文章:

Python 输出 CR CR LF?

python - 尽管 Eclipse PyDev 中存在 Unresolved 导入错误,脚本仍会运行,但如果错误已修复,则脚本会停止运行

如果只有一个值,Java 8 收集器会返回一个值

java - 无法使用 selenium 网络驱动程序连接到 Electron /CEF 应用程序

java - 初始猜测的优化是否会使巴比伦法快速求平方根?

python - 我将如何使用南迁移将数据加载到 Django 的 auth_group 表中?

Python+LDAP+SSL

java 。不接受 0 作为文本字段中的第一个输入

java - 为什么说: "Checked exceptions are not forwarded in calling chain (propagated)"?

python - 使用相同的符号生成许多 SymPy 表达式