0

java/tomcat6 webapp から python スクリプトを呼び出そうとしています。現在、次のコードを使用しています。

           Process p = Runtime.getRuntime().exec("python <file.py>"); 
       InputStream in = p.getInputStream();
       InputStreamReader isr = new InputStreamReader(in); 
       BufferedReader b = new BufferedReader(isr);

       logger.info("PYTHON OUTPUT");


       String line = null;
       while ( (line = b.readLine()) != null){
            logger.info(line);
       }

       p.waitFor();
       logger.info("COMPLETE PYTHON OUTPUT");
       logger.info("EXIT VALUE: "+p.exitValue());

Python スクリプトから catalinia.out ファイルに出力がまったく表示されず、スクリプトが Python の Numpy モジュールを必要とするいくつかの機械学習ライブラリに依存しているため、jython のようなアダプター ライブラリを使用することはできません。

ヘルプ?

4

1 に答える 1

1

説明は、おそらく次の 1 つ (または複数) です。

  • コマンドが失敗し、「stderr」fd にエラー メッセージを書き込んでいます ... 見ていません。

  • コマンド名が正しくないため、コマンドを起動できません。たとえば、 では見つかりません$PATH

  • コマンドはその fd から読み取ろうとしてstdinいます ... しかし、(まだ) 入力を提供していません。

  • コマンドラインの分割に問題がある可能性があります。たとえば、スペースが埋め込まれたパス名を使用している場合、または通常はシェルによって処理されるその他のものを使用している場合。

また、これは python であるため、これは python 固有の環境変数、現在のディレクトリ、および/またはコマンドを実行している実効ユーザーに問題がある可能性があります。


どうやって進める:

  1. python コマンドが実際に開始されているかどうかを確認します。例えば。「」を「ハック」して、起動時に一時ファイルに何かを書き込みます。

  2. ProcessBuilderオブジェクトの作成に using に変更しProcessます。これにより、ストリームとその処理方法をより詳細に制御できます。

  3. 子プロセス「stderr」に何が起こっているかを調べます。(ProcessBuilder を使用すると、「stdout」にリダイレクトできます...)

于 2013-07-20T00:04:53.110 に答える