6

Python オブジェクトを Java に送信して、このチュートリアルの例を拡張しようとしています。Python と Java の間で String オブジェクトを交換するサンプル コードは正常に動作しますが、それを独自の Python オブジェクト (Event) に置き換えようとすると、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'

これを解決する方法はありますか?

4

1 に答える 1

5

問題は、純粋なPythonオブジェクトをJava側に送信できないことです(この場合、pushを呼び出すと、実際にはJavaメソッド「Stack.push」が呼び出されます)。送信できるのは、(1)Javaオブジェクトに自動的に変換できるオブジェクト(int、バイト配列、文字列などのプリミティブ)、(2)「スタック」などのJavaから受信したオブジェクト、または(3)Javaを実装するPythonオブジェクトのみです。インターフェイス

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)
于 2013-01-22T10:00:21.580 に答える