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

标签 java python jython jpype py4j

我是 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/

相关文章:

java - AtomicInteger 与同步的 getter/setter

python - Pyramid 中的数据库配置

java - jdbc:从 java.sql.Type 代码中获取 SQL 类型名称

android - 如何在monkeyrunner代码中运行外部程序?

java - 将列表变成 Actor (Greenfoot)

java - 在 Weblogic Server 8.13 中记录 SQL

java - 使用java语言构建AWS-CDK时出现错误

python - 仅使用一个辅助数组实现合并排序(而不是递归地创建新数组)

python - 使用 "setup.py develop"确定程序已安装

java - java 到 python 的最新通信