Sha*_*hab 103 python java jython
我想知道是否可以使用jython从java代码调用python函数,还是仅用于从python调用java代码?
Voo*_*Voo 90
Jython:Java平台的Python - http://www.jython.org/index.html
您可以使用Jython从Java代码轻松调用python函数.只要你的python代码本身在jython下运行,即不使用一些不受支持的c-extension.
如果这对你有用,那肯定是你能得到的最简单的解决方案.否则,您可以使用org.python.util.PythonInterpreter新的Java6解释器支持.
一个简单的例子来自我的头脑 - 但我应该工作:(没有为简洁而做错误检查)
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);
Run Code Online (Sandbox Code Playgroud)
Sni*_*192 56
嘿,我以为即使迟到,我也会输入我的答案.我认为首先要考虑一些重要的事情,你希望有多强大的java和python之间的链接.
首先 ,您是否只想调用函数或者您是否真的想要python代码来更改java对象中的数据?这是非常重要的.如果您只想调用带或不带参数的python代码,那么这并不是很困难.如果你的参数是原始的,那么它就更容易了.但是如果你想在python中有java类实现成员函数,这会改变java对象的数据,那么这不是那么容易或直截了当.
其次我们是在谈论cpython还是会jython呢?我会说cpython就是它的所在!我主张这就是为什么python如此酷!有这么高的抽象但是在需要时可以访问c,c ++.想象一下,如果你能在java中拥有它.这个问题甚至不值得问,如果jython是好的,因为无论如何它很容易.
所以我使用了以下方法,并将它们从易到难的列出:
Java到Jython
优点:轻松简单.有对java对象的实际引用
缺点:没有CPython,非常慢!
来自java的Jython非常简单,如果这真的足够那么好.然而它非常慢,没有cpython!没有cpython,生活是否值得生活我不这么认为!您可以轻松地使用python代码为您的java对象实现您的成员函数.
通过Pyro从Jython到CPython的Java
Pyro是python的远程对象模块.你在cpython解释器上有一些对象,你可以发送它通过序列化传输的对象,它也可以通过这种方法返回对象.请注意,如果从jython发送序列化的python对象,然后调用一些更改其成员中的数据的函数,那么您将不会在java中看到这些更改.您只需要记住从pyro发回您想要的数据.我相信这是进入cpython的最简单方法!你不需要任何jni或jna或swig或....你不需要知道任何c或c ++.嗯嗯?
优点:访问cpython,不像以下方法那么困难
缺点:无法直接从python更改java对象的成员数据.有点间接,(jython是中间人).
Java到C/C++通过嵌入式解释器通过JNI/JNA/SWIG到Python(也许使用BOOST库?)
OMG这种方法不适合胆小的人.而且我可以告诉你,用一种不错的方法实现这一目标需要很长时间.你想要这样做的主要原因是你可以运行cpython代码,它完全控制你的java对象.在决定尝试使用python(就像一匹马)来尝试和java(就像一只黑猩猩)一样,需要考虑一些重要的事情.首先,如果你崩溃的解释器为你的程序点亮了!并且不要让我开始处理并发问题!此外,还有分配锅炉,我相信我找到了最好的配置,以尽量减少这个锅炉,但它仍然是分配!那么如何解决这个问题:考虑到C++是你的中间人,你的对象实际上是c ++对象!好,你现在知道了.只需将您的对象编写为cpp中的程序,而不是使用您希望从两个世界访问的数据.然后你可以使用名为swig的包装器生成器(http://www.swig.org/Doc1.3/Java.html)使java可以访问它并编译一个你在其中调用System.load(dll name)的dll. java的.让这个先工作,然后继续努力!要进入python,您需要嵌入一个解释器.首先,我建议做一些hello解释程序或本教程在C/C中嵌入python.一旦你有了工作,就有时间让马和猴子跳舞!您可以通过[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有一个teary.我知道,是的.有很多方法可以解决这个问题.因此,请确保逐块完成每件事.然后把它们放在一起.
Pei*_* Hu 13
在java中使用python代码并不聪明.用烧瓶或其他Web框架包装您的python代码,使其成为微服务.让你的java程序能够调用这个微服务(例如通过REST).
相信我,这很简单,将为您节省大量的问题.代码松散耦合,因此可扩展.
这里有一个库,可以让你编写一次python脚本,并决定在运行时使用哪种集成方法(Jython,CPython/PyPy通过Jep和Py4j):
https://github.com/subes/invesdwin-context-python
由于每种方法都有其自身的优点/缺点,如链接中所述.
GraalVM是一个不错的选择。我已经将 Java+Javascript 与 GraalVM 结合用于微服务设计(Java 与 Javascript 反射)。他们最近增加了对 python 的支持,我会尝试一下,特别是这些年来它的社区已经发展到了多大。
2021 年 6 月更新
https://www.graalvm.org/reference-manual/python/说
GraalVM 提供符合 Python 3.8 的运行时。GraalVM Python 运行时的主要目标是支持 SciPy 及其组成库,以及与来自丰富的 Python 生态系统的其他数据科学和机器学习库一起使用。此时,Python 运行时可供实验和好奇的最终用户使用。
| 归档时间: |
|
| 查看次数: |
155068 次 |
| 最近记录: |