如何在Java和Python之间创建双向通信
我对Java和Python都是新手,尽管我有一些编程经验。对于赋值,我需要创建一个以某种方式使用Java的程序。我的项目将使用Java作为UX,使用Python进行信号处理和特征提取,因为它有一些很好的工具。 然而,我的问题是如何在两个程序之间建立通信。也许以前有人问过这个问题,但因为我不知道最好的术语,所以我找不到答案 在我的Java程序中,我可以获取.csv文件的文件路径,将其发送到Python,Python将返回原始信号和处理后的信号。为此,我写道:如何在Java和Python之间创建双向通信,java,python,frontend,backend,Java,Python,Frontend,Backend,我对Java和Python都是新手,尽管我有一些编程经验。对于赋值,我需要创建一个以某种方式使用Java的程序。我的项目将使用Java作为UX,使用Python进行信号处理和特征提取,因为它有一些很好的工具。 然而,我的问题是如何在两个程序之间建立通信。也许以前有人问过这个问题,但因为我不知道最好的术语,所以我找不到答案 在我的Java程序中,我可以获取.csv文件的文件路径,将其发送到Python,Python将返回原始信号和处理后的信号。为此,我写道: private static void
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(或类似的东西)与之通信。由于您没有提到您的应用程序有多健壮,我可以想到一个解决方案,如果您正在规划更高级别的体系结构,可以使用它
尽量避免在运行时执行命令,因为代码中的命令面向用户,好像没有正确管理一样。始终存在安全漏洞的可能性。一般建议:基于文件的通信通常很慢,因为文件通常存储在存储驱动器(HDD或SSD)上。您可以使用套接字来实现相当快速和可移植的进程间通信。如果您想要更快的性能,您可以使用共享内存,但套接字通常对于大多数工作负载来说都足够快。@JérômeRichard如果处理结果不需要在用户的单个会话中持久化,则此建议有效。持久性存储的一个明显的替代方案也是一个更健壮的数据库,但这会带来复杂性,并且只有在处理的不同方面之间存在关系时才是必要的。然后显示的代码已经在调用Python进程了。我看不出加载本机库代码有什么帮助,或者C/C++示例有什么帮助