我有一个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正在执行,但之后没有任何内容。 我哪里错了?
答案 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应用程序输出足够的数据以刷新缓冲区(或刷新其写入)。
不要忘记干净利落地加入和退出。祝你好运。