首页 > 解决方案 > 如何在一个项目中使用不同的语言

问题描述

最近我决定用 Java 和 Python 编写一个程序,但我不知道该怎么做……有没有办法让项目中的类相互通信,以便 Java 可以调用 Python 方法?是否有任何框架可以让我处理这个问题?我还想知道有经验的程序员是如何用多种语言编写他们的项目的。

我的想法是用 JavaFX 编写我的程序的 Gui,因为它的外观很棒,并且可以使用谷歌库在 Python 中进行语音识别。

标签: javapythoncode-structureproject-structuring

解决方案


有 3rd 方库可用于此目的,但如果您也愿意包含第三种语言,也可以不使用该桥梁。由于您的问题的标题,这部分答案提供了更通用的“不同语言”答案。

Java JNI(Java Native Interface)允许您在 Java 和本机代码之间架起桥梁。从技术上讲,本机代码可以用于编译为本机代码或以某种方式支持它的任何语言,但实际上 JNI 通常用于使 Java 与 C 或 C++ 一起工作。

Java/C 和 Java/C++ 有很多例子。Python 还支持与本机代码一起工作。请参阅从 Python 调用 C/C++?所以你可以做的是使用 C++ 作为 Java 和 Python 之间的中间人。您需要学习使用 Python/native 桥接器,并学习使用 Java/native 桥接器,然后将两者放在一起使用 Python/native/Java。

这有利有弊。缺点:您现在被迫引入第三种语言并支持更大的复杂性。优点:如果您愿意同时使用多种语言,这自然会打开同时使用多种不同语言的大门,因为很多语言都支持调用本机代码。

另外的选择

另一种方法是让每种不同的语言在单独的进程中运行,并让不同的进程通过某种类型的进程间通信来回传递它们的数据。一些常见的方法是通过套接字(用于网络通信的相同东西)、磁盘上的文件和共享内存

尽管套接字可能以网络通信而闻名(即:“http 互联网流量通常会在端口 80 上打开一个到服务器的套接字”),但它也常用于本地进程间通信。您将以相同的方式打开一个套接字,但通常是主机名“localhost”,通常是 IP 地址127.0.0.1

这增加了跟踪进程之间的消息并实际处理它们的复杂性。根据您的环境和需求,这种复杂性可能比在 1 个进程中运行多种语言更复杂或更简单。如果您以后需要扩展您的应用程序,将其分成多个进程可能会更容易在套接字或文件的情况下在多台机器之间分配负载。


针对您的具体情况

您提到您希望 Java 用于 GUI。Java GUI 无论如何都是在其自己的单独线程上处理的,因此您应该能够从 Python 调用 Java 中的 GUI 初始化函数来设置和显示您的 GUI。请注意并发问题(即多线程问题)。

另外,我忘记了Jython。感谢@Jeremy 指出这一点。我从未亲自使用过它,但它是“Java 平台的 Python”。你可以调查一下,看看它是否提供了你需要的东西。

另外,根据@that other guy 的评论:

Google Cloud Speech API 有一个 Java API,就像它有一个 Python API 一样。只需使用它并为自己省去很多麻烦。

因此,您可能甚至不需要首先进行任何桥接。但是,如果您决定要允许多语言支持以及未来的用户,我会按照您的要求保留对您问题的回答。


推荐阅读