java代码调用Python代码,1.2,将数组格式转
分享于 点击 46453 次 点评:157
java代码调用Python代码,1.2,将数组格式转
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 使用byte字节数组格式传递大量参数。
2.1.1java
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader;public static void main(String[] args) throws IOException {
// 创建一个包含double类型数据的列表
List<Double> data = new ArrayList<>();
for (double i = 1; i < 300; i++) data.add(i);
// 将double类型的数据序列化为字节数组
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
DataOutputStream dataOut = new DataOutputStream(byteOut);
for (double d : data) {
dataOut.writeDouble(d);
}
byte[] dataBytes = byteOut.toByteArray();
Integer a = 123;
Integer b = 456;
Integer c = 789;
Integer d = 101112;
String[] cmd = {"E:\\Program Files\\python.exe", "E:\\wzCode\\testing.py", a.toString(), b.toString(), c.toString(), d.toString()};
// 将字节数组写入标准输入流
Process p = Runtime.getRuntime().exec(cmd);
p.getOutputStream().write(dataBytes);
p.getOutputStream().close();
// 读取 Python 脚本的输出结果
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
}
}
2.1.2Python代码
import sys import struct import array # 从标准输入中读取字节数据 print(sys.argv) data_bytes = sys.stdin.buffer.read() # 计算double类型数据的字节数 double_size = struct.calcsize('d') # 按照big-endian字节顺序解析double类型数据 data_array = array.array('d') for i in range(0, len(data_bytes), double_size): double_bytes = data_bytes[i:i+double_size] data_array.append(struct.unpack('>d', double_bytes)[0]) # 将double类型的数据转换为float类型的数据,并将其打印为十进制的double数组 print("[", end="") for i, d in enumerate(data_array): if i > 0: print(", ", end="") print("{:.7g}".format(d), end="") print("]") ###################### prameters = [] for i in range(1, len(sys.argv)): prameters.append(eval(sys.argv[i])) result = Fre_integral(data_array, prameters[0],prameters[1],prameters[2],prameters[3],prameters[4]) print(result)
2.2 将数据保存读取后写入文件,调用Python脚本读取数据,执行算法返回参数。
2.2.1java
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(); } }
2.2,2python
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)
用户点评