2014-04-18 4 views
6

최근에 py4j를 발견했으며 파이썬에서 정적 자바 메소드를 호출 할 수있었습니다. 이제 java에서 파이썬 메소드를 호출하려고합니다. 나는 많은 문서를 찾을 수 없기 때문에 그것이 가능한지, 그리고 어떻게 가능할지를 생각할 수있는 마지막 장소라고 생각한다.py4j - 어떻게 자바에서 파이썬 메소드를 호출할까요?

+0

가능한 중복 : http://stackoverflow.com/questions/14450173/send-a-python-object-to-java-using-py4j? rq = 1 – Barthelemy

답변

5

자바에서 파이썬 메서드를 호출 할 수 있습니다. implementing a Java interface on the python side.

단계는 다음과 같습니다

  1. 는 예를 들어, 파이썬에서 py4j.examples.Operator
  2. 는, 클래스를 생성하고 클래스 내부에 "구현"과 자바 클래스를 만들고, 자바 인터페이스를 만들기 들.
  3. 파이썬에서 start_callback_server = True를 사용하여 게이트웨이를 인스턴스화하십시오. 예 : gateway = JavaGateway(start_callback_server=True)
  4. 파이썬에서는 Java 인터페이스를 구현하는 클래스를 인스턴스화하여 Java 측으로 보냅니다.
  5. 자바에서는 인터페이스를 호출하십시오. Py4J 문서에서 적응

예 :

자바 코드 :

// File 1 
package py4j.examples; 

public interface Operator { 
     public int doOperation(int i, int j); 
     public int doOperation(int i, int j, int k); 
} 

// File 2 
package py4j.examples; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import py4j.GatewayServer; 

public class OperatorExample { 

    // To prevent integer overflow 
    private final static int MAX = 1000; 

    public List<Integer> randomBinaryOperator(Operator op) { 
     Random random = new Random(); 
     List<Integer> numbers = new ArrayList<Integer>(); 
     numbers.add(random.nextInt(MAX)); 
     numbers.add(random.nextInt(MAX)); 
     numbers.add(op.doOperation(numbers.get(0), numbers.get(1))); 
     return numbers; 
    } 
} 

파이썬 코드 :

from py4j.java_gateway import JavaGateway 

class Addition(object): 
    def doOperation(self, i, j, k = None): 
     if k == None: 
      return i + j 
     else: 
      return i + j + k 

    class Java: 
     implements = ['py4j.examples.Operator'] 

if __name__ == '__main__': 
    gateway = JavaGateway(start_callback_server=True) 
    operator = Addition() 
    operator_example = gateway.jvm.py4j.examples.OperatorExample() 

    # "Sends" python object to the Java side. 
    numbers = operator_example.randomBinaryOperator(operator) 
+0

좋은 예입니다. py4j 0.8.2.1 – user3451476

+1

으로 이것이 어떻게 달성 될 수 있는지 말할 수 있습니다. 0.8.2.1에서와 같이 작동해야합니다. – Barthelemy

+0

파이썬 스크립트를 수정할 필요없이'.py' 파일을 주어진 파이썬 함수를 호출 할 수 있습니다. Jython PythonInterpreter를 사용하면 파이썬 파일에 정의 된 함수를 호출 할 수 있습니다. (http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html#utilizing-pythoninterpreter). py4j와 비슷한 것이 가능합니까? – Mahesha999