当前位置: 首页 > 面试题库 >

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

卢聪
2023-03-14
问题内容

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

我的主要要求是:

  • 调用应该是透明的,从某种意义上说,它不应.py仅需要修改文件就可以从Java对其进行调用。我可能会得到任何带有某些功能的python文件。我应该能够调用任何这些功能,而无需修改.py文件。
  • 我希望能够同时发送原语类型(的参数intStringfloats等等)或非原语类型(HashMapArrayList从Java)来Python函数和接收返回所返回的对象(其原始类型或非原始类型的可能)从蟒到Java。我也使用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

     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。但是没有给出太多有关从java调用python的信息,因此我可以得出结论是否可以满足我的上述要求。谁能对此给予更多的了解?更具体地说,如果我们可以编写与Jython PythonInterpreter中的代码一样少的代码。
  • 使用 JPype:但是,快速浏览之后,我感到无法像Jython PythonInterpreter那样编写最少的代码。我也觉得该项目没有得到开发。是吗?

如果我正确理解上述所有方法,似乎Jython PythonInterpreter是最佳选择。我在抓住错误时是否犯了错误?还有其他更好的选择吗?


问题答案:

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

有时您想要的答案不可用!



 类似资料:
  • 我在将这部分Java转换为Kotlin时遇到了问题: 方法的第二个参数(注意不是集合)接受。我尝试了几个解决方案,包括提供一个lambda: 但这导致: 错误:(32,38)Kotlin:意外标记 错误:(33,38)Kotlin:意外标记 错误:(31,56)Kotlin:类型不匹配:推断的类型是Kfunction1<@parametername mutablehttpresponse<>?,u

  • 问题内容: 我有两个不同形状的numpy数组,但是长度(引导尺寸)相同。我想对它们中的每一个进行混洗,以使相应的元素继续对应-即相对于其前导索引一致地对它们进行混洗。 该代码有效,并说明了我的目标: 例如: 但是,这感觉笨拙,效率低下且速度慢,并且需要复制数组-我宁愿就地对它们进行混洗,因为它们会很大。 有没有更好的方法来解决这个问题?更快的执行速度和更低的内存使用是我的主要目标,但是优雅的代码也

  • 给定一个字符串,返回子字符串长度2在该字符串中出现的次数计数,并作为该字符串的最后2个字符,因此“hixxxhi”产生1(我们不计算结束子字符串)。 我在其中一个网站上发现了这个问题(https://codingbat.com/prob/p145834). 网站上对上述问题的回答如下: 我对下面提到的代码行有疑问 现在,我知道这段代码正在提取字符串“str”的最后两个字母。我感到困惑的是变量名。正

  • 目前,我得到了以下函数,该函数遍历Pandas DataFrame()列并创建一个计数: 我有许多参数要分配给/调用函数——目前,我正在做以下工作: 这样做效果很好,但我想知道是否有更实用/有效的方法可以达到同样的效果。 我正在考虑将变量名添加到列表中,例如、、、等,并形成某种循环——如果这样做可行的话。。。 因此,也许有点像: 或者,有没有使用熊猫的方法?

  • 问题内容: 我很清楚如何用C ++扩展Python,但是如果我想用Java编写要与numpy一起使用的函数怎么办? 这是一个简单的场景:我想使用Java类来计算numpy数组的平均值。如何将numpy向量传递给Java类并收集结果? 谢谢你的帮助! 问题答案: 我花了一些时间回答自己的问题,并希望分享我的答案,因为我觉得关于 stackoverflow的 这个主题的信息不多。我还认为,由于Java

  • (我使用的是Mongo Java Driver 2.12.0和RoboMongo。) 我正在从java创建一个mongo DB,并用所有来自java的数据填充它。所有这些对我来说都很有效。我已经在我的数据库中制作了几个我想要的javascript函数。如果我通过Robomongo shell手动插入这些函数,使用: 并在java中通过db.eval()调用这些函数,这些函数运行得很好。现在我想做的