我正在尝试通过 Java 运行 Python 脚本,但我只想在 Python 中运行导入行一次,因为我在我的 Python 脚本中导入了 TensorFlow 和 spaCy。导入它们需要时间,所以我不想通过 Java 一次又一次地运行整个脚本。有什么办法吗?
这是我的 Python 代码。这只是示例代码,因为我正在处理这个问题
import sys
while True:
# read input from standard input
input_str = input()
# process the input
output_str = "Processed input: " + input_str
# write output to standard output
print(output_str)
sys.stdout.flush()
这是我的java代码
import java.io.*;
import java.util.Map;
import java.util.Scanner;
import java.util.stream.Stream;
public class RunPythonScriptInteractive {
public static void main(String[] args) throws Exception {
// Start the Python process
try {
ProcessBuilder builder = new ProcessBuilder();
Map env = builder.environment();
env.put("PATH", env.get("PATH") + ":/home/parth/miniconda3/bin");
builder.command("/bin/bash", "-c", "python pythontry.py");
builder.redirectErrorStream(true);
Process process = builder.start();
Scanner cin = new Scanner(System.in);
BufferedWriter outputWriter = process.outputWriter();
BufferedReader reader = process.inputReader();
for (int i = 0; i < 3; i++) {
String input = cin.nextLine();
outputWriter.write(input);
outputWriter.newLine();
outputWriter.flush();
Stream<String> lines = reader.lines();
lines.forEach(System.out::println);
}
outputWriter.close();
reader.close();
process.destroy();
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
}
}
我试图通过我的 Java 代码向我的 Python 脚本提供三次输入,但它不起作用。
我希望如果我从我的 Java 代码中输入三次,我会从我的 Python 脚本中得到三次输出,例如:
hello
Processed input: hello
world
Processed input: world
nice
Processed input: nice
我终于找到了解决方案,这里是 python 代码
import sys
while True:
# read input from standard input
input_str = input()
# process the input
output_str = "Processed input: " + input_str
# write output to standard output
print(output_str)
sys.stdout.flush()
在 Java 中,我们必须创建 2 个类,一个用于提供输入,另一个类用于读取输出,我们将不得不使用多线程,一个线程为脚本提供输入,另一个线程从脚本读取输出。
这里是主类,它将为脚本提供输入并返回最终输出。
import java.io.BufferedWriter;
import java.util.Map;
import java.util.Scanner;
public class MainClass {
public static void main(String[] args) {
Process process = null;
String output="";
ThreadClass thread = null;
try {
ProcessBuilder builder = new ProcessBuilder();
Map env = builder.environment();
env.put("PATH", env.get("PATH") + ":/home/parth/miniconda3/bin");
builder.command("/bin/bash", "-c", "python pythontry.py");
process = builder.start();
Scanner cin = new Scanner(System.in);
BufferedWriter outputWriter = process.outputWriter();
thread = new ThreadClass(process);
thread.start();
for(int i=0; i<3; i++)
{
String input = cin.nextLine();
outputWriter.write(input);
outputWriter.newLine();
outputWriter.flush();
}
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
finally {
process.destroy();
output = thread.getOutput();
System.out.println(output);
}
}
}
这是第二个线程类,它将读取 python 脚本的输出
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.Map;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Stream;
public class ThreadClass extends Thread {
Process process;
String output;
public ThreadClass(Process process) {
// TODO Auto-generated constructor stub
this.process = process;
output="";
}
public void readOutputFromScript() throws IOException {
try{
BufferedReader reader = process.inputReader();
String line;
while(true)
{
line = reader.readLine();
if(line==null || line.equals(""))
{
break;
}
output+=line;
System.out.println(line);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
}
public void run()
{
try {
readOutputFromScript();
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
}
public String getOutput()
{
return output;
}
}
感谢所有帮助我找到这个解决方案的朋友