首先,对为什么的一点解释我首先要问这个问题: 我正在编写一个python程序(带有一个wxPython gui),需要从python调用Java AWT程序并从中提取数据。我在Windows上有一个进程内工作解决方案。只要我无头地运行Java应用程序,我在OSX上也有一个进程内解决方案。遗憾的是,我找不到在OSX上在同一进程中运行两个GUI的合理解决方案,因为AWT和WX都想要第一个线程并且不能共享wx消息循环。
我想要做的是在与Python程序不同的进程中启动Java程序,并建立管道或队列或者来回传递数据(特别是字节数组)。
我非常感谢任何建议,甚至是正确方向的推动,因为我对IPC的经验很少。
答案 0 :(得分:3)
答案 1 :(得分:3)
我尝试使用管道对解决方案进行编码,但似乎它们不太适合在附加可能较大的数据的情况下来回发送多条消息。相反,它们似乎是打开运行,响应和死亡的“工人”风格程序的理想选择。
关于套接字编程,我在这里找到了一个很棒的资源:https://web.archive.org/web/20080913064702/http://www.prasannatech.net/2008/07/socket-programming-tutorial.html
本教程介绍了用4种语言编写的简单聊天程序的TCP和UDP变体。我最终使用并修改了TCP Java客户端和Python服务器。
答案 2 :(得分:3)
这是Google用于在Java和Python之间进行IPC的开源解决方案。 https://code.google.com/p/protobuf/
推荐。
答案 3 :(得分:1)
使用subprocess.Popen启动Java进程并建立管道以与之通信。要以语言中立,平台中立,可扩展的方式有效地序列化和反序列化数据,请查看Protocol Buffers(由Jon Skeet提供!)。
答案 4 :(得分:0)
我遇到类似的情况,我必须在Java进程和Linux进程之间进行通信。我使用了命名管道。
在python中尝试mkfifo()实现。
答案 5 :(得分:0)
在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()