如何在 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 中传递/复制参数

如何在 .NET 和 Java 之间创建跨平台进程间通信?

套接字阻止在 Java 服务器和 Python 客户端之间发送消息

Python - 创建具有 2 个值之间的数字的列表?

如何使用java网络编程在四个系统之间创建点对点通信

在 Python 中获取数据透视表列之间的差异