如何在 Java 和 Python 之间创建 2 路通信
Posted
技术标签:
【中文标题】如何在 Java 和 Python 之间创建 2 路通信【英文标题】:How to create a 2 way communication between Java and Python 【发布时间】:2021-07-01 04:22:40 【问题描述】:我对 Java 和 Python 都很陌生,尽管我有一些编程经验。对于作业,我需要创建一个以某种方式使用 Java 的程序。我的项目将使用 Java 作为 UX,使用 Python 进行信号处理和特征提取,因为它有一些很好的工具。 但是,我的问题是如何在两个程序之间建立通信。可能以前有人问过这个问题,但由于我不知道最好的术语,所以我找不到答案。
在我的 Java 程序中,我可以获取 .csv 文件的文件路径,将其发送到 Python,Python 返回原始信号和处理后的信号。为此,我写道:
private static void sendPython(String path, JTextField console)
String pathPython = "C:\\Users\\gonca\\Desktop\\untitled0.py";
String [] cmd = new String[3];
cmd[0] = "python";
cmd[1] = pathPython;
cmd[2] = path;
Runtime r = Runtime.getRuntime();
try
Process p = r.exec(cmd);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String s = "";
while((s = in.readLine()) != null)
console.setText(s);
catch (IOException e)
console.setText("Unable to run python script");
我正在考虑让 py 脚本在单独的行中输出信号,值由“,”或“;”分隔,并使用 BufferedRead 读取每一行,分离值并从分离的价值观。 但是,在开始更加努力地做这件事之前,我想知道这是否是最好的方法,或者有没有更有效的方法。
【问题讨论】:
一般建议:基于文件的通信通常很慢,因为文件通常存储在存储驱动器(HDD 或 SSD)上。您可以使用 sockets 来启用相当快速且可移植的 进程间通信。如果您想要更快的性能,您可以使用 shared-memory,但对于大多数工作负载而言,套接字通常足够快。 @JérômeRichard 如果处理结果不需要保留在用户的单个会话之外,则此建议是有效的。持久存储的一个明显替代方案也是更强大的数据库,但这会带来复杂性,并且只有在您处理的不同方面之间存在关系时才是必要的。 【参考方案1】:还有更多方法可以做到这一点:
解决方案 1:
通过System.loadLibrary
使用来自java 的python 库,并调用python 方法。 (这里是一个使用 C/C++ 的例子:Calling a python method from C/C++, and extracting its return value)
解决方案 2:
将 python 作为另一个进程启动,并使用 D-Bus(或类似的东西)与之通信。
【讨论】:
然后显示的代码已经很好地调用了 Python 进程。我看不出尝试加载本机库代码有什么帮助,或者 C/C++ 示例有什么帮助【参考方案2】:由于您没有提到您的应用程序有多健壮,我可以想到一个解决方案,如果您正在规划更高级别的架构,可以使用该解决方案。
-
创建一个基于 python 的 Web 应用程序(HTTP 服务器),其中包含处理文件的所有逻辑。
创建一个可以通过 HTTP python 服务器进行通信以获取 CSV 处理信息的 java 应用程序。
尽量避免在运行时执行代码中的命令,这些命令面对用户,就好像它没有得到适当的管理,总是有安全漏洞的机会
【讨论】:
以上是关于如何在 Java 和 Python 之间创建 2 路通信的主要内容,如果未能解决你的问题,请参考以下文章
当我们在 https 和 http 之间切换时,如何在 java springs 2.5.6 中传递/复制参数