gpt4 book ai didi

java - 从 Java 调用 python 函数的不同/更好的方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:24 29 4
gpt4 key购买 nike

我是 python 的新手,正在尝试从 java 调用 python 的函数。

我的主要要求是:

  • 调用应该是透明的,因为它不需要修改 .py文件只是为了使它能够从 java 中调用。我可能会得到其中包含一些函数的任何 python 文件。我应该能够调用这些函数中的任何一个而无需修改 .py文件。
  • 我希望能够将原始类型(intStringfloats 等)或非原始类型(HashMapArrayList)的参数从 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)

从执行的 python 代码中返回 Java 值

例如

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com