在 Java 中调用 Python?

新手上路,请多包涵

我想知道是否可以使用 Jython 从 Java 代码调用 Python 函数,还是仅用于从 Python 调用 Java 代码?

原文由 Shahab 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 803
2 个回答

Jython:用于 Java 平台的 Python - http://www.jython.org/index.html

您可以使用 Jython 从 Java 代码轻松调用 python 函数。只要你的python 代码本身在jython 下运行,即不使用一些不受支持的c 扩展。

如果这对您有用,那肯定是您可以获得的最简单的解决方案。否则,您可以使用新的 Java6 解释器支持中的 org.python.util.PythonInterpreter

我脑海中的一个简单示例-但我希望应该可以工作:(为简洁起见,未进行错误检查)

 PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import sys\nsys.path.append('pathToModules if they are not there by default')\nimport yourModule");
// execute a function that takes a string and returns a string
PyObject someFunc = interpreter.get("funcName");
PyObject result = someFunc.__call__(new PyString("Test!"));
String realResult = (String) result.__tojava__(String.class);

截至 2021 年,Jython 不支持 Python 3.x

原文由 Voo 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为首先要考虑一些重要的事情,你希望 java 和 python 之间的链接有多强大。

首先,您是只想调用函数还是真的想让 python 代码更改 java 对象中的数据?这个非常重要。如果你只想调用一些带参数或不带参数的 python 代码,那么这不是很难。如果您的论点是原语,那么它会变得更加容易。然而,如果你想让 java 类在 python 中实现成员函数,改变 java 对象的数据,那么这就不是那么容易或直接了。

其次,我们是在谈论 cpython 还是 jython 会做?我会说 cpython 就是它的所在!我会提倡这就是 python 如此酷的原因!具有如此高的抽象,但在需要时可以访问 c、c++。想象一下,如果您可以在 Java 中拥有它。这个问题甚至不值得问 jython 是否可以,因为无论如何它都很容易。

所以我尝试了以下方法,并从易到难列出了它们:

Java 到 Jython

优点: 简单易行。实际引用 java 对象

缺点: 没有 CPython,非常慢!

来自 Java 的 Jython 非常简单,如果这真的足够了,那就太好了。但是它很慢而且没有cpython!没有 cpython 的生活值得吗?我不这么认为!您可以轻松地让 python 代码为您的 java 对象实现您的成员函数。

通过 Pyro 从 Java 到 Jython 再到 CPython

Pyro 是 python 的远程对象模块。你在 cpython 解释器上有一些对象,你可以向它发送通过序列化传输的对象,它也可以通过这个方法返回对象。请注意,如果您从 jython 发送一个序列化的 python 对象,然后调用一些更改其成员中数据的函数,那么您将不会在 java 中看到这些更改。你只需要记住从 pyro 发回你想要的数据。我相信这是进入 cpython 的最简单方法!您不需要任何 jni 或 jna 或 swig 或…。您不需要了解任何 c 或 c++。酷吧?

优点: 接入cpython,没有下面方法那么难

缺点: 不能直接从python中更改java对象的成员数据。有点间接,(jython 是中间人)。

Java 通过 JNI/JNA/SWIG 到 C/C++ 通过嵌入式解释器到 Python(可能使用 BOOST 库?)

天哪,这种方法不适合胆小的人。我可以告诉你,我花了很长时间才用一种像样的方法实现了这一点。你想要这样做的主要原因是你可以运行 cpython 代码,它完全控制你的 java 对象。在决定尝试用 python(就像马)来面包 java(就像黑猩猩)之前,需要考虑一些重要的事情。首先,如果您使解释器崩溃,那么您的程序就会熄灭!不要让我开始讨论并发问题!另外,还有allot allot的boiler,我相信我已经找到最好的配置来最小化这个boiler了,但是还是allot!那么如何去做:考虑 C++ 是你的中间人,你的对象实际上是 C++ 对象!很高兴你现在知道了。只需像使用 cpp 而不是 java 中的程序一样编写您的对象,并使用您想要从两个世界访问的数据。然后你可以使用名为 swig ( http://www.swig.org/Doc1.3/Java.html ) 的包装器生成器来使 java 可以访问它并编译一个你称之为 System.load(dll name here) 的dll爪哇。首先让这个工作,然后继续困难的部分!要使用 Python,您需要嵌入一个解释器。首先,我建议做一些 hello 解释器程序或本教程 Embedding python in C/C 。一旦你完成了这项工作,就该让马和猴子跳舞了!您可以通过 [boost][3] 将 c++ 对象发送到 python。我知道我没有给你鱼,只是告诉你在哪里可以找到鱼。编译时需要注意的一些提示。

当你编译 boost 时,你需要编译一个共享库。您需要从 jdk 中包含并链接到您需要的内容,即 jawt.lib、jvm.lib(启动应用程序时,您还需要在路径中包含客户端 jvm.dll)以及 python27.lib 或无论如何和 boost_python-vc100-mt-1_55.lib。然后包含 Python/include、jdk/include、boost 并且只使用共享库 (dll),否则 boost 会很累。是的,我知道。有很多方法可以使它变坏。因此,请确保逐块完成每件事。然后把它们放在一起。

原文由 Derrops 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏