从J调用python函数的不同/更好方法

2024-05-29 03:47:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python相当陌生,正在尝试从java调用python的函数。在

我的主要要求是:

  • 调用应该是透明的,在某种意义上,它不应该仅仅为了从java调用而需要修改.py文件。我可能会得到任何包含一些函数的python文件。我应该能够调用这些函数中的任何一个,而不需要修改.py文件。在
  • 我希望能够将原语类型(intStringfloats等)或非原语类型(HashMapArrayList)的参数从java发送到python函数,并从python接收返回的对象(可能是基元类型或非基元类型)。我还使用pandas DataFrame和numpy ndarray,因此也希望能够在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

    ^{pr2}$

    我很能满足我的需要。但不是CPython。

  • 使用ScriptEngine:这与PythonInterpreter非常相似。但它的Jython。另外,与PythonInterpreter不同,我们不能使用jython2.5+并且不能直接访问PyObjects。所以这个选项可以很好的关闭。

  • 使用py4j:找不到与jythonpythonInterpreter一样最小的示例
  • 使用java2python。但是not much information is given关于从java调用python,这样我就可以得出结论,我的上述要求是否能够得到满足。有人能解释清楚吗?更具体地说,如果我们可以编写尽可能少的jythonpythonInterpreter中的代码。在
  • 使用JPype:但是在快速浏览之后,我觉得我不能像JythonPythonInterpreter那样编写最少的代码。我也觉得这个项目有点不在开发阶段。它是?在

似乎jythonpythonInterpreter是最好的选择,如果我已经正确地理解了以上所有方法。我抓错了吗?还有其他更好的选择吗?在


Tags: 文件对象函数py类型选项jythonjava
2条回答

这个问题目前没有答案。使用CPython依赖于Python字节码的执行,这又要求Python解释器嵌入到执行环境中。由于没有Java运行时附带嵌入式Python解释器,看起来Jython确实是最好的答案。在

有时候你想要的答案是不可能的!在

@Mahesha999,关于坚持CPython的能力,从你最后的评论来看,这似乎很重要:

Jep是一个很好的选择,可以运行python代码,它使用对本机的调用,比如您提到的pandas。在

您需要编写一些包装代码,因为Jep只在最常用的类型之间实现Java和Python之间的自动转换,pandas.DataFrame不是。在

但是,如果您的用例并不复杂,您可以通过在dataframe实例上调用DataFrame.values将pandas对象作为numpy.NDArray对象访问,并且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应用程序中,目前为止它还可以工作。在

相关问题 更多 >

    热门问题