0

グラスフィッシュ サーバー上の Java サーブレットに送信された JSON ファイルからデータのプロットを生成しようとしています。サーブレットでは、Python スクリプトを呼び出してプロットを実行する bash スクリプトを呼び出そうとしています。

サーバーにログインしてターミナルから実行すると、bash および python スクリプトは正常に動作しますが、サーブレットから呼び出すと動作しません。いくつかのテストの後、matplotlib のインポートが問題の原因であると考えています。Pythonスクリプトからmatplotlibに関連するコードを削除すると、正常に実行されますが、matplotlibコードでは何も起こらず、エラーも発生しません。

以下はサーブレットのコードです。

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 に答える