【问题标题】:IPC (inter process communication) between python and javapython和java之间的IPC(进程间通信)
【发布时间】:2011-03-22 08:33:53
【问题描述】:

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

我想做的是在与我的 Python 程序不同的进程中启动一个 Java 程序,并建立一个管道或队列或其他东西来来回传递数据(特别是字节数组)。

我非常感谢任何建议,甚至是朝着正确方向轻推,因为我对 IPC 的经验很少。

【问题讨论】:

  • 您能否独立于启动 GUI 来加载 Java 类?
  • 是的,我有一个使用 JNI 的包装器

标签: java python ipc multiprocessing multiple-processes


【解决方案1】:

我尝试使用管道编写解决方案,但似乎它们不太适合来回发送多条消息,并附加了潜在的大数据。相反,它们似乎是打开运行、响应和终止的“工人”式程序的理想选择。

研究套接字编程,我在这里找到了一个很棒的资源:@​​987654321@

本教程介绍了用 4 种语言编写的简单聊天程序的 TCP 和 UDP 变体。我最终使用并修改了 TCP Java 客户端和 Python 服务器。

【讨论】:

    【解决方案2】:

    【讨论】:

    • Hrm,从 Python 的角度来看,这似乎很容易,但从我正在阅读的内容来看,Java 只能将 FIFO 视为文件,并且无法在独立于操作系统的情况下创建它们大大地。这对于将图像发送到 Java 应该没问题,但我不确定它是否足以让它们恢复。
    • FIFO 依赖于平台,它们实际上是通过 UNIX 中的文件接口使用的 (en.wikipedia.org/wiki/Named_pipe)。如果您对此感到不舒服(或者更喜欢标准库支持的东西),您可以使用套接字。
    【解决方案3】:

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

    推荐。

    【讨论】:

    • 这很棒。虽然它严重依赖于 O-O 模型,因此对于类似 C 的语言来说可能是不可能的。但它回答了这个问题 + 使用套接字发送消息。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我遇到过类似的情况,我必须在 Java 进程和 Linux 进程之间进行通信。我使用了命名管道。

      尝试在 python 中实现 mkfifo()。

      【讨论】:

        【解决方案6】:

        在python中使用subprocess的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()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-01
          • 2015-08-11
          • 2012-02-11
          • 1970-01-01
          • 1970-01-01
          • 2011-08-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多