java代码调用Python代码

发布时间 2023-06-07 15:29:38作者: 党王

1,使用runtime调用Python脚本

String[] arguments = new String[]{
                "E:\\Program Files\\python.exe",
                "E:\\wzCode\\signal.py",
                Arrays.toString(datas),
                String.valueOf(Num)};
            // 执行py文件,注意:这里的命令都最好用绝对路径,到底用哪一个环境的下的Python,比如env下面的tf2的环境;具体执行哪个python文件,也是绝对路径
            Process proc = Runtime.getRuntime().exec(arguments);

1.1 ,传参不能传递数组[],这样只是传递了地址值。

1.2,将数组格式转换为List类型,转换为String,但是会显示文件名称过长

ava.io.IOException: Cannot run program "E:\Program Files\python.exe": CreateProcess error=206, 文件名或扩展名太长。
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at java.lang.Runtime.exec(Runtime.java:620)
    at java.lang.Runtime.exec(Runtime.java:485)
    at com.weizu.common.utils.file.FileReaderScheduler.parse(FileReaderScheduler.java:162)
    at com.weizu.common.utils.file.FileReaderScheduler.lambda$paroseDocutment$0(FileReaderScheduler.java:91)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:308)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: CreateProcess error=206, 文件名或扩展名太长。
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
    at java.lang.ProcessImpl.start(ProcessImpl.java:137)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 12 more

2,换种其他方式传递参数

2.1 如将原始数据保存读取后写入文件,调用Python脚本读取数据,执行算法返回参数。

java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        // 创建数据文件
        String fileName = "data.txt";
        FileWriter writer = new FileWriter(fileName);
        for (double i = 0; i < 1000000; i++) {
            writer.write(Double.toString(i) + "\n");
        }
        writer.close();

        // 执行 Python 脚本,并传递数据文件名作为参数
        String[] cmd = {"python", "script.py", fileName};
        Process p = Runtime.getRuntime().exec(cmd);

        // 读取 Python 脚本的输出结果
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }
        in.close();
    }
}

Python代码

import sys
import numpy as np

def process_data(data_file):
    # 从数据文件中读取数据
    data = np.loadtxt(data_file)
    
    # 在这里处理数据,例如调用你的算法函数
    result = np.mean(data)
    
    # 返回处理结果
    return result

if __name__ == '__main__':
    # 将命令行参数解析为数据文件名
    data_file = sys.argv[1]
    
    # 处理数据
    result = process_data(data_file)
    
    # 输出结果
    print(result)

 

2.2 文件怎么能放小一点。