连接Python和Java - 多线程输入和输出流

时间:2013-12-02 09:38:31

标签: java python multithreading stream

我有一个Python应用程序和一个同时运行的Java应用程序。 我希望Java启动Python进程,然后使用普通的STDIN / STDOUT流与Python进行通信。 我已正确启动进程并有两个线程来处理两个I / O流。

OUTPUT THREAD:

class output2 extends Thread {

Process process;
OutputStream stdin;
BufferedWriter writer;
Scanner in = new Scanner(System.in);

output2(Process p) {
    try {
        process = p;
        stdin = process.getOutputStream();
        writer = new BufferedWriter(new OutputStreamWriter(stdin));
    } catch (Exception e) {
        System.out.println("ERROR output2(): " + e);
    }
}

@Override
public void run() {
    System.out.println("Starting OUTPUT THREAD");
    try {
        while (true) {
            String input = in.nextLine();
            writer.write(input);
            writer.flush();
        }
    } catch (Exception e) {
        System.out.println("ERROR output2_run(): " + e);
    }
    System.out.println("Ending OUTPUT THREAD");
}
}

INPUT THREAD:

class input2 extends Thread {

Process process;
InputStream stdout;
BufferedReader reader;

input2(Process p) {
    try {
        process = p;
        stdout = process.getInputStream();
        reader = new BufferedReader(new InputStreamReader(stdout));
    } catch (Exception e) {
        System.out.println("ERROR input2(): " + e);
    }
}

@Override
public void run() {
    System.out.println("Started INPUT THREAD");
    try {
        while (true) {
            System.out.println(Thread.currentThread().getName() + " is executing");
            if (reader.readLine() != null) {
                System.out.println("Stdout: " + reader.readLine());
            }
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + " stopped executing");
        }
    } catch (Exception e) {
        System.out.println("ERROR input2_run(): " + e);
    }
    System.out.println("Ending INPUT THREAD");
}
}

主要:

public class My_Java {

public static void main(String args[]) {
    File file = new File("C:\\Location\\");
    try {
        Process process = Runtime.getRuntime().exec("C:\\Python27\\python.exe chat_from_file.py", null, file);
        input2 input = new input2(process);
        output2 output = new output2(process);
        input.setName("INPUT THREAD");
        output.setName("OUTPUT THREAD");
        input.start();
        output.start();
    } catch (Exception e) {
        System.out.println("ERROR main(): " + e);
    }
}
}

这似乎没有给出任何回应。 它启动了两个线程,说INPUT THREAD正在执行,但之后没有任何内容。 我哪里错了?

1 个答案:

答案 0 :(得分:2)

首先,在输入类中调用if (reader.readLine() != null) {后,您实际上已经阅读了该行,下一个调用将返回null

使用ready检查非阻塞读取的可能性。不要提前阅读。

但是,我非常确定您的处理存在异常,例如python: can't open file 'chat_from_file.py': [Errno 2] No such file or directory或者抛出堆栈跟踪并退出。

如果存在错误,请使用getErrorStream检查进程输出的内容。这将使您找到解决问题的正确途径。

另外,为了以防万一,请确保实际上有东西要读。确保您的Python应用程序输出足够的数据以刷新缓冲区(或刷新其写入)。

不要忘记干净利落地加入和退出。祝你好运。