我对python相当陌生,正在尝试从java调用python的函数。在
我的主要要求是:
.py
文件。我可能会得到任何包含一些函数的python文件。我应该能够调用这些函数中的任何一个,而不需要修改.py
文件。在int
,String
,floats
等)或非原语类型(HashMap
,ArrayList
)的参数从java发送到python函数,并从python接收返回的对象(可能是基元类型或非基元类型)。我还使用pandas DataFrame和numpy ndarray,因此也希望能够在java之间发送和接收相应的对象。在我在网上找到了几个选项。很少有:
使用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。所以这个选项可以很好的关闭。
似乎jythonpythonInterpreter是最好的选择,如果我已经正确地理解了以上所有方法。我抓错了吗?还有其他更好的选择吗?在
这个问题目前没有答案。使用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值例如
我是在一个用Python编写的项目中这样做的,我需要将它作为一个插件集成到Java应用程序中,目前为止它还可以工作。在
相关问题 更多 >
编程相关推荐