3

私の観点からはブラックボックスを編集できないPythonアプリケーションがあります。Python アプリケーションは、テキストを処理し、処理されたテキストを返す方法を知っています。処理されていないテキストを収集する方法を知っている Java で書かれた別のアプリケーションがあります。

現在の状態では、Python アプリは x 分ごとにバッチ モードで動作します。

パイソンを作りたい

プロセスの処理部分: Java アプリはテキストを収集し、フローの一部として処理されたテキストを処理して返すように Python アプリに要求します。

これに対する最も簡単な解決策は何だと思いますか?

ありがとう、ロッド

4

6 に答える 6

7

Jythonなどについては何も知りません。Java アプリがテキストを変換する必要があるたびに新しいプロセスを実行することなく、2 つのプログラムを実行できるのであれば、それが最善の解決策だと思います。とにかく、単純な概念実証は、Java アプリとは別のプロセスを実行してそれを機能させることです。次に、これらすべてのツールを使用して実行を強化できます。

Javaから別のプロセスを実行する

String[] envprops = new String[] {"PROP1=VAL1", "PROP2=VAL2" };
Process pythonProc = Runtime.getRuntime().exec(
   "the command to execute the python app", 
    envprops, 
    new File("/workingdirectory"));

// get an outputstream to write into the standard input of python
OutputStream toPython = pythonProc.getOutputStream();

// get an inputstream to read from the standard output of python
InputStream fromPython = pythonProc.getInputStream();

// send something
toPython.write(.....);
// receive something
fromPython.read(....);

重要: 文字はバイトではありません

多くの人がこれを過小評価しています。

char から byte への変換には注意してください (Writers/Readers は char 用であり、Input/OutputStreams はバイト用であり、エンコードは相互に変換するために必要です。OuputStreamWriter文字列をバイトに変換して送信し、InputStreamReaderバイトを char に変換して読み取るために使用できます)。彼ら)。

于 2009-12-31T09:22:28.937 に答える
6

Jythonを調べてみてください。Pythonプログラムを Java コードから直接実行し、シームレスにやり取りできます。

于 2009-12-31T07:57:12.193 に答える
5

ProcessBuilderを使用して、 Pythonコードをフィルターとして実行します。

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class PBTest {

    public static void main(String[] args) {
        ProcessBuilder pb = new ProcessBuilder("python", "-c", "print 42");
        pb.redirectErrorStream(true);
        try {
            Process p = pb.start();
            String s;
            BufferedReader stdout = new BufferedReader (
                new InputStreamReader(p.getInputStream()));
            while ((s = stdout.readLine()) != null) {
                System.out.println(s);
            }
            System.out.println("Exit value: " + p.waitFor());
            p.getInputStream().close();
            p.getOutputStream().close();
            p.getErrorStream().close();
         } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
于 2009-12-31T13:42:54.453 に答える
0

2 つのうちの 1 つを何らかのサービス (Web サービスなど) として公開します。もう 1 つのオプションは、Python コードを Jython に移植することです。

于 2009-12-31T07:58:32.207 に答える
0

考えられる解決策の 1 つは、jpypeです。これにより、Python から JVM を起動し、それらの間でデータをやり取りできます。

別の解決策として、Python プログラムをフィルターとして記述し (標準入力からデータを読み取り、結果を標準出力に書き込む)、それをパイプとして実行することもできます。ただし、Java がこれをどの程度サポートしているかはわかりません。Sun のドキュメントによると、パイプの概念は同じ JVM 上のスレッド間の通信のみをサポートします。

于 2009-12-31T09:01:41.893 に答える
0

オプションは、Python アプリケーションをサーバーとして機能させ、ソケット (TCP) 経由でリクエストをリッスンすることです。

于 2009-12-31T09:22:30.460 に答える