我正在尝试从发送到glassfish服务器上的java servlet的JSON文件生成数据图。在servlet中,我试图调用一个调用python脚本来执行绘图的bash脚本。
如果我登录到服务器并从终端运行它们,但是当从servlet调用它们时它们不起作用,bash和python脚本工作正常。经过一些测试后,我相信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')
答案 0 :(得分:0)
如果你确定它的导入,那么我愿意下注问题是一个导入问题。有几种简单的方法可以测试它。我想到的第一个问题是,在你的bash脚本中,在执行脚本之前su进入你的用户。它似乎不是一个非常安全的永久解决方案,但它会验证它是一个模块加载问题。