17

まず、そもそもなぜこの質問をしているのかについて少し説明します。PythonからJava AWTプログラムを呼び出し、そこからデータを抽出する必要があるpythonプログラム(wxPython guiを使用)を作成しています。私はWindows上で進行中の作業ソリューションを持っています。また、Javaアプリをヘッドレスで実行している限り、OSXでインプロセスソリューションを使用しています。残念ながら、AWTとWXの両方が最初のスレッドを必要とし、wxメッセージループを共有できないため、OSXで同じプロセス内で両方のGUIを実行するための合理的な解決策は見つかりませんでした。

私がやりたいのは、Pythonプログラムとは別のプロセスでJavaプログラムを起動し、データ(具体的にはバイト配列)をやり取りするためのパイプやキューなどを確立することです。

私はIPCの経験がほとんどないので、何か提案があれば、あるいは正しい方向に少しでも進んでいただければ幸いです。

4

6 に答える 6

4

パイプを使用してソリューションをコーディングしようとしましたが、パイプは、潜在的に大きなデータが添付された状態で複数のメッセージを送受信するのにはあまり適していないようです。むしろ、実行、応答、および終了する「ワーカー」スタイルのプログラムを開くのに理想的であるように思われます。

ソケットプログラミングを調べてみると、ここで素晴らしいリソースを見つけました:https ://web.archive.org/web/20080913064702/http://www.prasannatech.net/2008/07/socket-programming-tutorial.html

このチュートリアルでは、4つの言語で記述された単純なチャットプログラムのTCPおよびUDPバリアントを紹介します。最終的に、TCPJavaクライアントとPythonサーバーを使用して変更しました。

于 2010-09-27T14:00:30.337 に答える
3

名前付きパイプがあなたの答えかもしれません。参照: Pythonで一時FIFO(名前付きパイプ)を作成しますか?

于 2010-07-28T19:46:18.920 に答える
3

これは、GoogleがJavaとPythonの間でIPCを実行するために使用するオープンソースソリューションです。 https://code.google.com/p/protobuf/

おすすめされた。

于 2013-07-12T21:00:49.497 に答える
1

subprocess.Popenを使用してJavaプロセスを開始し、Javaプロセスと通信するためのパイプを確立します。言語に中立で、プラットフォームに中立で、拡張可能な方法でデータを効率的にシリアル化および逆シリアル化するには、Protocol Buffers ( Jon Skeetによる寄稿!)を参照してください。

于 2010-07-28T19:41:11.193 に答える
1

subprocessPythonでfromを使用するIPC

ここにあるIPC.javaファイルのJavaコードは、数値を受け取り、その2乗を送信します。

import java.util.Scanner;

public class IPC {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String data="";
        while(scanner.hasNext()){
            // Receive data from Python code 
            data = scanner.nextLine();

            // Process data (calculate square)
            int x = Integer.parseInt(data);
            int square = x*x;


            // Send data to python code
            System.out.println(square);
        }
        scanner.close();
    }
}

IPC.pyファイル

import subprocess
subprocess.run(["javac", "IPC.java"])
proc = subprocess.Popen(["java", "IPC"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
for i in range(10):
    # Send to java code
    proc.stdin.write(b'%d\n' % i)
    proc.stdin.flush()
    proc.stdout.flush()

    # Receive data from java code
    output = proc.stdout.readline()
    print (output.rstrip())
proc.communicate()
于 2020-03-15T19:51:25.757 に答える
0

JavaプロセスとLinuxプロセスの間で通信しなければならないという同様の状況がありました。名前付きパイプを使用しました。

Pythonでmkfifo()の実装を試してください。

于 2016-02-25T01:57:41.973 に答える