【问题标题】:Python wrapper to run a scala class运行 Scala 类的 Python 包装器
【发布时间】:2021-06-16 04:36:58
【问题描述】:

我有一个 maven scala 项目,其中包含这样的 scala 对象(myObject)

项目名称

    • 主要
      • 斯卡拉
        • 实用程序
          • 我的对象

myObject 有一个 main 函数定义为

def main(args: Array[String]): Unit = {
 --stuff
} 

我需要创建一个 python 包装脚本,它基本上会从用户那里获取一些参数,并将这些参数传递给那个 myObject。我该怎么做呢?到目前为止,我有一个带有 main 的 python 脚本,它使用 argparse 来接受一些争论,但不确定如何继续。

【问题讨论】:

  • 您可能想用您的代码生成一个 uber jar 并让您的 Python 脚本调用 java - jar foo.jar arg1 arg2 在任何情况下,为什么不阅读 中的参数Scala 代码?

标签: python scala maven


【解决方案1】:

如果我理解准确,Py4j 是您希望运行的库,因为本质上 scala 编译为 JVM 字节码,您可以使用 py4j 运行 scala 或 java 方法。

这里是 py4j 网站主页的摘要:

Py4J 使在 Python 解释器中运行的 Python 程序能够动态访问 Java 虚拟机中的 Java 对象。调用方法就像 Java 对象驻留在 Python 解释器中一样,并且可以通过标准 Python 集合方法访问 Java 集合。 Py4J 还使 Java 程序能够回调 Python 对象。 Py4J 在 BSD 许可下分发。

这里是一个简短的例子,说明你可以用 Py4J 做什么。下面的 Python 程序从 JVM 创建一个 java.util.Random 实例并调用它的一些方法。它还访问自定义 Java 类 AdditionApplication 以添加生成的数字。

>>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()                   # connect to the JVM
>>> random = gateway.jvm.java.util.Random()   # create a java.util.Random instance
>>> number1 = random.nextInt(10)              # call the Random.nextInt method
>>> number2 = random.nextInt(10)
>>> print(number1, number2)
(2, 7)
>>> addition_app = gateway.entry_point               # get the AdditionApplication instance
>>> value = addition_app.addition(number1, number2) # call the addition method
>>> print(value)
9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2019-12-07
    • 2016-05-03
    • 2018-06-05
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多