使用java servlet中的matplotlib调用python脚本

时间:2013-04-02 18:53:55

标签: java python bash servlets matplotlib

我正在尝试从发送到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')

1 个答案:

答案 0 :(得分:0)

如果你确定它的导入,那么我愿意下​​注问题是一个导入问题。有几种简单的方法可以测试它。我想到的第一个问题是,在你的bash脚本中,在执行脚本之前su进入你的用户。它似乎不是一个非常安全的永久解决方案,但它会验证它是一个模块加载问题。