17

首先,稍微解释一下为什么我首先要问这个问题:我正在编写一个 python 程序(带有 wxPython gui),它需要从 python 调用 Java AWT 程序并从中提取数据。我在 Windows 上有一个正在进行的工作解决方案。只要我无头运行 Java 应用程序,我在 OSX 上也有一个进程内解决方案。不幸的是,我没有找到合理的解决方案来在 OSX 上的同一进程中运行两个 GUI,因为 AWT 和 WX 都想要第一个线程并且不能共享 wx 消息循环。

我想做的是在与我的 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 变体。我最终使用并修改了 TCP Java 客户端和 Python 服务器。

于 2010-09-27T14:00:30.337 回答
3

命名管道可能是您的答案。请参阅: 在 Python 中创建临时 FIFO(命名管道)?

于 2010-07-28T19:46:18.920 回答
3

这是谷歌用来在 Java 和 Python 之间进行 IPC 的开源解决方案。 https://code.google.com/p/protobuf/

推荐的。

于 2013-07-12T21:00:49.497 回答
1

使用subprocess.Popen启动 Java 进程并建立管道与之通信。要以与语言无关、与平台无关、可扩展的方式有效地序列化和反序列化数据,请查看Protocol Buffers(由Jon Skeet提供!)。

于 2010-07-28T19:41:11.193 回答
1

subprocess在python中使用from的IPC

此处的 IPC.java 文件 java 代码将接收数字并发送它的平方。

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 回答