Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java和Python之间创建双向通信_Java_Python_Frontend_Backend - Fatal编程技术网

如何在Java和Python之间创建双向通信

如何在Java和Python之间创建双向通信,java,python,frontend,backend,Java,Python,Frontend,Backend,我对Java和Python都是新手,尽管我有一些编程经验。对于赋值,我需要创建一个以某种方式使用Java的程序。我的项目将使用Java作为UX,使用Python进行信号处理和特征提取,因为它有一些很好的工具。 然而,我的问题是如何在两个程序之间建立通信。也许以前有人问过这个问题,但因为我不知道最好的术语,所以我找不到答案 在我的Java程序中,我可以获取.csv文件的文件路径,将其发送到Python,Python将返回原始信号和处理后的信号。为此,我写道: private static void

我对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读取每行,分隔值并从分隔的值中创建一个新的ArrayList。
但是,在开始更努力地工作之前,我想知道这是最好的方法,还是有更有效的方法。有更多的方法可以做到这一点:

解决方案1:

将java中的python库与
System.loadLibrary
一起使用,并调用python方法。(下面是一个使用C/C++的示例:)

解决方案2:


将python作为另一个进程启动,并使用D-Bus(或类似的东西)与之通信。

由于您没有提到您的应用程序有多健壮,我可以想到一个解决方案,如果您正在规划更高级别的体系结构,可以使用它

  • 创建一个基于python的web应用程序(HTTP服务器),该应用程序包含处理文件的所有逻辑
  • 创建一个java应用程序,它可以通过HTTP python服务器进行通信,以获取CSV处理信息

  • 尽量避免在运行时执行命令,因为代码中的命令面向用户,好像没有正确管理一样。始终存在安全漏洞的可能性。

    一般建议:基于文件的通信通常很慢,因为文件通常存储在存储驱动器(HDD或SSD)上。您可以使用套接字来实现相当快速和可移植的进程间通信。如果您想要更快的性能,您可以使用共享内存,但套接字通常对于大多数工作负载来说都足够快。@JérômeRichard如果处理结果不需要在用户的单个会话中持久化,则此建议有效。持久性存储的一个明显的替代方案也是一个更健壮的数据库,但这会带来复杂性,并且只有在处理的不同方面之间存在关系时才是必要的。然后显示的代码已经在调用Python进程了。我看不出加载本机库代码有什么帮助,或者C/C++示例有什么帮助