使用 Py4j 将 Python 对象发送到 Java

Posted

技术标签:

【中文标题】使用 Py4j 将 Python 对象发送到 Java【英文标题】:Send a Python object to Java using Py4j 【发布时间】:2013-01-05 04:31:30 【问题描述】:

我正在尝试通过将 Python 对象发送到 Java 来扩展 this tutorial 的示例。虽然在 Python 和 Java 之间交换 String 对象的示例代码工作正常,但当我尝试用我自己的 Python 对象(事件)替换它时,会显示有关 object_id 的错误。

Python 代码:

class Event(object):
   #some content here

stack = gateway.entry_point.getStack()
event = Event()

stack.push(event)

错误:

Traceback (most recent call last):
  File "/home/******/src/py4jSample.py", line 19, in <module>
   stack.push(event)
  File "/usr/local/lib/python2.7/dist-packages/py4j-0.7-py2.7.egg/py4j/java_gateway.py", line 423, in __call__
    [get_command_part(arg, self.pool) for arg in new_args])
  File "/usr/local/lib/python2.7/dist-packages/py4j-0.7-py2.7.egg/py4j/protocol.py", line 241, in get_command_part
    command_part = REFERENCE_TYPE + parameter._get_object_id()
AttributeError: 'Event' object has no attribute '_get_object_id'

知道如何解决这个问题吗?

【问题讨论】:

欢迎来到 ***!错误所在的行在您的示例代码中不存在。那个代码在哪里? 谢谢大卫。代码“stack.push(event)”是产生错误的地方。 您是否尝试向名为_get_object_id 的对象添加属性? @nickb 谢谢。我刚刚添加了一个方法_get_object_id,错误不再出现。但是,当我尝试打印Java类中接收到的对象时,它显示了该对象的Null值。 【参考方案1】:

问题是您不能将纯 Python 对象发送到 Java 端(在这种情况下,调用 push 实际上会调用 Java 方法“Stack.push”)。您只能发送 (1) 可以自动转换为 Java 对象的对象(原语,例如 int、字节数组、字符串),(2) 从 Java 接收的对象,例如“stack”,或 (3) Python objects implementing a Java interface:

class Event(object):
    def myMethod(param1, param2):
        return "foo"

    class Java:
        implements = ['yourpackage.IEvent']

如果要发送实现 Java 接口的 Python 对象,则需要接受来自 Python 解释器的传入连接(如果调用 Python 方法,JVM 将回调 Python 解释器):

gateway = JavaGateway(start_callback_server=True)
stack = gateway.entry_point.getStack()
event = Event()
stack.push(event)

【讨论】:

谢谢!这回答了我的担忧。我将查看 (2) 和 (3) 来交换数据。

以上是关于使用 Py4j 将 Python 对象发送到 Java的主要内容,如果未能解决你的问题,请参考以下文章

来自 Java Runnable 的 Py4J 回调

Java 数组到 NumPy 数组的快速转换 (Py4J)

Java InputStream 到 Python (PY4J)

py4j - 我将如何在 java 中调用 python 方法

使用py4j将Log4j连接到java / python项目中的ipython notebook stderr

如何在 py4j 中将 Java 列表转换为 Python 列表