前言
接到的开发任务中涉及调取python脚本并执行,关于java调取Python脚本有好几种方法,大家可以自行百度,重点粘贴下我的代码(使用的是java的Runtime)与及说下我遇到的问题。
代码
private LinkedHashMap<String, String> runtimePython(String id, String type) throws IOException, InterruptedException {
LinkedHashMap<String, String> map = new LinkedHashMap();
//调用python脚本 获取预测趋势
Process proc;
String abPath = System.getProperty("catalina.home");
char a = File.separatorChar;
String phantomjsPath = abPath + a + "webapps" + a + "archetype-ui-istorm" + a + "phantomjs";
String pythonPath = null;
if (type.equals("pool")) {
pythonPath = phantomjsPath + a + "python" + a + pythonPool;
} else {
pythonPath = phantomjsPath + a + "python" + a + pythonVolume;
}
String[] args = new String[]{python, pythonPath, id};
proc = Runtime.getRuntime().exec(args);
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(), "GBK"));
String line = null;
while ((line = in.readLine()) != null) {
if (line.contains("[{")) {
System.out.println(line);
line = line.replaceAll("'", "\"");
List<JSONObject> linkedHashMap = JSON.parseArray(line, JSONObject.class);
LOGGER.info("python返回数据", linkedHashMap);
linkedHashMap.forEach(forecast -> {
map.put(forecast.getString("time"), forecast.getString("forecast"));
});
}
}
in.close();
proc.waitFor();
return map;
}
补充说明:python、pythonPool和pythonVolume都是配置文件获取的值,其中第一个是python运行的环境,后两者都是脚本的名称。(对于该代码,有优化建议的也可提出,这是初版代码)
遇到的问题
问题一:获取脚本数据为Null
网上找了很多方法,我基本上都尝试了,包括按照一些依赖之类的,都无果。这个坑真是让人头皮发麻。
针对这个问题,给大家总结的一句话就是,多半是脚本需要的依赖,你没有安装全,但是直接一句话告诉你:那就安装呗,好像又有点不太负责!,谁都知道安装呗,但也不是这么好安装的。
下面展示下python脚本引入的依赖:
import os
import sys
import pandas as pd
import numpy as np
import math
from fbprophet import Prophet
import json
from pandas import DataFrame
# from utils.CommonUtils import CommonUtils
from datetime import timedelta
import datetime
import time
from collections import OrderedDict
import matplotlib.pyplot as plt
import itertools
import pymysql
import pytz
import importlib
importlib.reload(sys)
import warnings
warnings.filterwarnings("ignore")
然后展示下我认为最难安装的两个包,