我是 python 的新手,正在尝试从 java 调用 python 的函数。
我的主要要求是:
- 调用应该是透明的,因为它不需要修改
.py
文件只是为了使它能够从 java 中调用。我可能会得到其中包含一些函数的任何 python 文件。我应该能够调用这些函数中的任何一个而无需修改.py
文件。 - 我希望能够将原始类型(
int
、String
、floats
等)或非原始类型(HashMap
、ArrayList
)的参数从 java 发送到 python 函数并接收将返回的对象(可能是原始类型或非原始类型)从 python 返回到 java。我也在使用 pandas DataFrame 和 numpy ndarray,因此也希望能够向 java 发送和从 java 接收相应的对象。 - 我更愿意坚持使用 CPython 而不是 Jython,因为我可能需要使用 Jython 中可能不可用的更新库。
我在网上找到了几个选项。少数是:
使用 Jython 的 PythonInterpreter 我可以用它调用 python 函数而不需要对
.py
做任何更改。脚本文件:py1.py
def square2(list): squares = [] for i in list: squares.append(i*i) return squares
JythonTest.groovy
import org.python.util.PythonInterpreter import org.python.core.*; class JythonTest { static main(def args) { PythonInterpreter pi = new PythonInterpreter() pi.exec("from py1 import square2") PyFunction pf = (PyFunction)pi.get("square2") println pf.__call__(new PyList([1,2,3,4]))[2] //9 } }
我能很好地满足我的需求。但它不是 CPython。
使用 ScriptEngine :这与 PythonInterpreter 非常相似。但是再次反对它的Jython。此外,与 PythonInterpreter 不同,我们不能使用 Jython 2.5+,也不能直接访问 PyObjects。所以这个选项可以很好的关闭。
- 使用 py4j :找不到与 Jython PythonInterpreter 一样最小的示例
- 使用 java2python 强>。但是not much information is given关于从 java 调用 python 以便我可以断定是否可以满足我的上述要求。谁能对此有更多的了解?更具体地说,如果我们可以编写与 Jython PythonInterpreter 中的代码一样最少的代码。
- 使用 JPype :然而,在快速浏览之后,我觉得我将无法像使用 Jython PythonInterpreter 那样编写尽可能少的代码。我也觉得这个项目有点不在开发中。是吗?
如果我正确理解了上述所有方法,那么 Jython PythonInterpreter 似乎是最佳选择。我是不是在把握的过程中犯了错误?还有其他更好的选择吗?
最佳答案
@Mahesha999,关于坚持使用 CPython 的能力,从你上一条评论来看,这似乎很重要:
Jep 是一个很好的选择,它能够运行使用本地调用的 python 代码,例如您提到的 pandas。
您需要编写一些包装代码,因为 Jep 仅在最常用的类型之间实现 Java 和 Python 之间的自动转换,而 pandas.DataFrame
不是。
但是,如果您的用例不是很复杂,您可以通过在数据帧实例上调用 DataFrame.values
来访问作为 numpy.NDArray
对象的 pandas 对象,以及 Jep实现到它为 NDArray 嵌入的 Java 类的转换。
您可以使用 Jep.getValue(String pythonVariableName, Class clazz)
例如
Jep jep = new Jep();
jep.eval("import my_script");
jep.eval("df = my_script.function_returning_a_dataframe()");
jep.eval("col = df.a_column.values");
NDArray myCol = jep.getValue("col", NDArray.class);
我在一个用 Python 编写的项目上这样做,我需要将其作为插件集成到 Java 应用程序中,到目前为止它可以正常工作。
关于java - 从 Java 调用 python 函数的不同/更好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39410339/