我正在尝试从发送到 glassfish 服务器上的 java servlet 的 JSON 文件生成数据图。在 servlet 中,我试图调用一个 bash 脚本,该脚本调用一个 python 脚本来执行绘图。
如果我登录到服务器并从终端运行它们,bash 和 python 脚本可以正常工作,但是从 servlet 调用它们时它们不起作用。经过一些测试,我相信 matplotlib 导入是导致问题的原因。如果我从 python 脚本中删除与 matplotlib 有关的代码,它将成功运行,但使用 matplotlib 代码什么也没有发生,我也没有错误。
下面是servlet代码:
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("./test.sh "+"122333333.JSON");
try {
proc.waitFor();
} catch (InterruptedException ex) {
Logger.getLogger(FileRetrieve.class.getName()).log(Level.SEVERE, null, ex);
}
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String line;
while ((line = bufferedreader.readLine()) != null) {
out.println("\nOUTPUT = " + line);
}
out.print("\nbefore execute6");
try {
if (proc.waitFor() != 0) {
out.println("\nexit value = " + proc.exitValue());
}
} catch (InterruptedException e) {
out.println("\nERROR = " + e);
}
下面是 bash 脚本:
#! /bin/bash
echo this is a test from script
echo $1
python script1.py $1
echo this is another test from script
以下是python脚本的一部分:
import json
import matplotlib as mpl
import sys
mpl.use('Agg')
import matplotlib.pyplot as plt
filename = sys.argv[-1]
if filename.find('.')==-1:
begin = filename[:filename.find('.')+1]
else:
begin = filename[:filename.find('.')]
json_data=open(filename)
data = json.load(json_data)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlabel('time (ns)')
ax.set_ylabel('acceleration (m/s^2)')
ax.set_title('Acceleration X')
ax.plot(data['aTime'], data['ax'], linewidth=1.0)
ax.grid(True)
fig.savefig(begin+'ax.png')