java - 使用 Py4j 将 Python 对象发送到 Java

标签 java python py4j

我正在尝试扩展 this tutorial 中的示例通过将 Python 对象发送到 Java。虽然在 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'

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

最佳答案

问题是你不能将纯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 接口(interface)的 Python 对象,则需要接受来自 Python 解释器的传入连接(如果调用 Python 方法,JVM 将回调 Python 解释器):

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

关于java - 使用 Py4j 将 Python 对象发送到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14450173/

相关文章:

java - 如何在 Java 中重写数组的 equals?

python - 大数组在 numpy 中创建 MemoryError

python - 是否有基于斯坦福神经网络的依赖解析器的 Python 包装器?

python - pyplot : really slow creating heatmaps

java - 如何在 Jython 和 PY4J 跨平台中使用 NLTK?

java - PY4J回调服务器错误

java - 使用 HSM 和 SUNPKCS11 进行文件签名时出现异常

java - 如何在 Intent 中插入 fragment (Android)

java - 如何在java正则表达式中对两个字符进行分组?

scala - 如何在 PySpark 中添加自定义 JDBC 方言