0

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

1 回答 1

0

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

于 2013-04-02T20:26:47.140 回答