最近有个功能需要java调用python脚本实现一些功能,前期需要做好的准备:配置好python环境,如下:
以下展示的为两种,一种为生成图片,另一种为生成字符串。
package com.msdw.tms.common.utils.py;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;/*** @Description: Java调用Python脚本* @Author: Maureen.Rong* @CreateDate: 2020/10/7 13:15* @UpdateDate: 2020/10/7 13:15* @Version: 1.0*/
public class PythonUtil {public static String path = "python";//这里指的是python环境,不需要改动//此处是写的你存放python脚本的地址,根据线上本地切换地址。public static String pyPathByPhoto = "C:\\Users\\Hello\\Desktop\\python\\photo.py";//生成图片public static String historyPath = "C:\\Users\\Hello\\Desktop\\python\\getVarByHistory.py";//历史模拟法//线上测试环境/*public static String pyPathByPhoto = "/usr/local/sichuan/py/photo.py";public static String historyPath = "/usr/local/sichuan/py/getVarByHistory.py";*//*** 动态传参调用Python脚本生成图片** @param pyPath* @param path* @param params* @throws IOException*/public static String getCodeByPhoto(String pyPath, String path, String... params) throws IOException {try {String[] args = new String[2 + params.length];args[0] = pyPath;args[1] = path;for (int x = 0; x < args.length; x++) {if (x > 1) {args[x] = params[x - 2];}}//执行py文件Process proc = Runtime.getRuntime().exec(args);BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));String line = null;String url = "";while ((line = in.readLine()) != null) {url += line + ",";System.out.println("获取结果:" + line);}in.close();proc.waitFor();return url;} catch (Exception e) {e.printStackTrace();}return null;}/*** 动态传参调用Python脚本:历史模拟** @param pyPath* @param path* @param params* @throws IOException*/public static String getCodeByHis(String pyPath, String path, String... params) throws IOException {try {String[] args = new String[2 + params.length];args[0] = pyPath;args[1] = path;for (int x = 0; x < args.length; x++) {if (x > 1) {args[x] = params[x - 2];}}//执行py文件Process proc = Runtime.getRuntime().exec(args);BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));String line = null;String str = "";while ((line = in.readLine()) != null) {System.out.println(line);str += line;}in.close();proc.waitFor();return str;} catch (Exception e) {e.printStackTrace();}return null;}public static void main(String[] args) throws Exception {//I为次数,t是天数,Z是传入进来的下单数*期货合约面值,arf为置信水平,ziliao为传入列表String print1 = getCodeByHis(path, historyPath,"0.95", "90", "6.8272,6.8474,6.8647,6.8925,6.8855,6.9116,6.9180,6.9179,6.9143,6.9192,6.9215,6.9318,6.9501,6.9440,6.9363,6.9413,6.9611,6.9680,6.9535,6.9366,6.9735,6.9809");System.out.println(">>>>>>>最后结果:" + print1);}
}
如下就是调用成功~

以下会po出python脚本一份~
import sysimport numpy as np
import pandas as pd
import scipy.stats as st
from pandas import DataFrame# 设P0为固值
P0 = 1000# 这里用
# ziliao = [6.8272,6.8474,6.8647,6.8925,6.8855,6.9116,6.9180,6.9179,6.9143,6.9192,6.9215,6.9318,6.9501,6.9440,6.9363,6.9413,6.9611,6.9680,6.9535,6.9366,6.9735,6.9809,]def aaa(arf,N,ziliao):# 打开表格取出里边的数据# print(ziliao)sum1 = ''for i in ziliao:sum1 += iziliao = sum1.split(",")sum = []for i in ziliao:i = float(i)sum.append(i)# print(sum)ziliao = sumziliao_return = DataFrame(ziliao)# 股票日收益stock_return = np.log(ziliao_return / ziliao_return.shift(1))# 删除缺失行stock_return = stock_return.dropna()# print(stock_return)a = stock_return.loc[:,0]# print(a)b = []for i in a * P0:b.append(i)b.sort()# print(b)b1=[]for i in b:i = "%.2f"%ib1.append(i)# print(b1)# p的中间的值为置信水平为95%情况下的收益率的波动率σ,这里默认先是0.95的p = np.percentile(a, (1, 5, 10), interpolation='midpoint')# p = np.abs(p[1])# print(p)if arf ==0.95:p = np.abs(p[1])elif arf==0.90 or arf==0.9:p = np.abs(p[0])elif arf==0.99:p = np.abs(p[2])var = b1[int(p-1)]var = np.abs(float(var))# print(var)var1 = np.sqrt(N) * float(var)return var1a2 = float(sys.argv[1])
# print(a2)
a3 = float(sys.argv[2])
# print(a3)
a1 = list(sys.argv[3])
# print(a1)# aaa(a2,a3,a1)
print(aaa(a2,a3,a1))
如下图效果展示~


















