如何在一个项目中使用不同的语言
How to use different languages in one project
最近我决定在Java和Python中编写一个程序,但我不知道该怎么做...有什么方法可以使类一起通信在项目中以便 Python 方法可以被 Java 调用?是否有任何框架可以让我处理这个问题?
我也想知道有经验的程序员如何用多种语言编写他们的项目。
我的想法是用 JavaFX 编写我的程序的 Gui,因为它的外观很棒,并且在 Python 中使用 google 库进行语音识别。
有 3rd 方库可用于此目的,但如果您也愿意包含第三方语言,也可以在没有的情况下建立桥梁。由于您问题的标题,这部分答案提供了更通用的 "different languages" 答案。
Java JNI (Java Native Interface) 允许您在 Java 和本机代码之间架起桥梁。从技术上讲,本机代码可以用于编译为本机代码或以某种方式支持它的任何语言,但实际上 JNI 通常用于使 Java 与 C 或 C++ 一起工作。
Java/C 和 Java/C++ 有很多例子。 Python 也支持与本机代码一起工作。参见 Calling C/C++ from Python? 所以你可以做的是使用 C++ 作为 Java 和 Python 之间的中间人。您将需要学习使用 Python/native 桥,并学习使用 Java/native 桥,然后将两者放在一起去 Python/native/Java.
这有利也有弊。缺点:您现在被迫引入第三种语言并支持更大的复杂性。 Pro:如果您愿意同时使用多种语言,这自然会打开使用多种不同语言的大门,因为许多语言都支持调用本机代码。
另一种选择
另一种方法是让每种不同的语言 运行 在一个单独的进程中,并让不同的进程通过某种类型的 inter-process 通信来回传递它们的数据。一些常见的方法是通过 sockets (the same things used for network communication), and by files on disk, and by shared memory.
虽然套接字最出名的可能是网络通信(即:"http internet traffic generally opens a socket to the server on port 80"),但它也常用于本地 inter-process 通信。您将以相同的方式打开套接字,但通常是主机名 "localhost",通常是 IP 地址 127.0.0.1
.
这增加了跟踪进程之间的消息并实际处理它们的复杂性。根据您的环境和需求,这种复杂性可能比 运行在 1 个进程中使用多种语言更复杂或更简单。如果您以后需要扩展您的应用程序,将它分成多个进程可能会更容易在套接字或文件的情况下在多台机器之间分配负载。
针对您的具体情况
您提到您想要 Java 的 GUI。 Java GUI 无论如何都是在其自己的单独线程上处理的,因此您应该能够从 Python 调用 Java 中的 GUI 初始化函数来设置和显示您的 GUI。请注意并发问题(即 multi-threading 问题)。
还有,我忘了Jython。感谢@Jeremy 指出这一点。我个人从未使用过它,但它确实 "Python for the Java platform." 您可以查看它是否提供您需要的东西。
另外,根据@那个人的评论:
The Google Cloud Speech API has a Java API just like it has a Python
API. Just use that and save yourself a ton of trouble.
所以您甚至可能一开始就不需要做任何桥接。但是,如果您决定无论如何要允许 multi-language 支持,以及为未来的用户提供支持,我会按照您提出的问题回答您的问题。
最近我决定在Java和Python中编写一个程序,但我不知道该怎么做...有什么方法可以使类一起通信在项目中以便 Python 方法可以被 Java 调用?是否有任何框架可以让我处理这个问题? 我也想知道有经验的程序员如何用多种语言编写他们的项目。
我的想法是用 JavaFX 编写我的程序的 Gui,因为它的外观很棒,并且在 Python 中使用 google 库进行语音识别。
有 3rd 方库可用于此目的,但如果您也愿意包含第三方语言,也可以在没有的情况下建立桥梁。由于您问题的标题,这部分答案提供了更通用的 "different languages" 答案。
Java JNI (Java Native Interface) 允许您在 Java 和本机代码之间架起桥梁。从技术上讲,本机代码可以用于编译为本机代码或以某种方式支持它的任何语言,但实际上 JNI 通常用于使 Java 与 C 或 C++ 一起工作。
Java/C 和 Java/C++ 有很多例子。 Python 也支持与本机代码一起工作。参见 Calling C/C++ from Python? 所以你可以做的是使用 C++ 作为 Java 和 Python 之间的中间人。您将需要学习使用 Python/native 桥,并学习使用 Java/native 桥,然后将两者放在一起去 Python/native/Java.
这有利也有弊。缺点:您现在被迫引入第三种语言并支持更大的复杂性。 Pro:如果您愿意同时使用多种语言,这自然会打开使用多种不同语言的大门,因为许多语言都支持调用本机代码。
另一种选择
另一种方法是让每种不同的语言 运行 在一个单独的进程中,并让不同的进程通过某种类型的 inter-process 通信来回传递它们的数据。一些常见的方法是通过 sockets (the same things used for network communication), and by files on disk, and by shared memory.
虽然套接字最出名的可能是网络通信(即:"http internet traffic generally opens a socket to the server on port 80"),但它也常用于本地 inter-process 通信。您将以相同的方式打开套接字,但通常是主机名 "localhost",通常是 IP 地址 127.0.0.1
.
这增加了跟踪进程之间的消息并实际处理它们的复杂性。根据您的环境和需求,这种复杂性可能比 运行在 1 个进程中使用多种语言更复杂或更简单。如果您以后需要扩展您的应用程序,将它分成多个进程可能会更容易在套接字或文件的情况下在多台机器之间分配负载。
针对您的具体情况
您提到您想要 Java 的 GUI。 Java GUI 无论如何都是在其自己的单独线程上处理的,因此您应该能够从 Python 调用 Java 中的 GUI 初始化函数来设置和显示您的 GUI。请注意并发问题(即 multi-threading 问题)。
还有,我忘了Jython。感谢@Jeremy 指出这一点。我个人从未使用过它,但它确实 "Python for the Java platform." 您可以查看它是否提供您需要的东西。
另外,根据@那个人的评论:
The Google Cloud Speech API has a Java API just like it has a Python API. Just use that and save yourself a ton of trouble.
所以您甚至可能一开始就不需要做任何桥接。但是,如果您决定无论如何要允许 multi-language 支持,以及为未来的用户提供支持,我会按照您提出的问题回答您的问题。