我正在尝试通过 Java 运行 Python 脚本,但我只想在 Python 中运行一次导入行

问题描述 投票:0回答:1

我正在尝试通过 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 java processbuilder
1个回答
0
投票

我终于找到了解决方案,这里是 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;
    }
}

感谢所有帮助我找到这个解决方案的朋友

© www.soinside.com 2019 - 2024. All rights reserved.