Python에서 Java 호출

Marion Paul Kenneth Mendoza 2023년10월10일
  1. Pyjnius를 사용하여 Python에서 Java 호출
  2. Javabridge를 사용하여 Python에서 Java 호출
  3. JPype를 사용하여 Python에서 Java 호출
  4. Py4J를 사용하여 Python에서 Java 호출
Python에서 Java 호출

이전 기사에서 우리는 Jython을 사용하여 Python에서 Java를 호출하는 방법을 다뤘습니다. 자세한 내용은 이 링크에서 읽을 수 있습니다.

그러나 Python에서 Java를 호출하는 방법에는 여러 가지가 있습니다. 따라서 이 기사에서는 Python에서 Java를 호출하는 여러 가지 방법에 대해 설명합니다.

Pyjnius를 사용하여 Python에서 Java 호출

‘Pyjnius’는 리플렉션을 사용하여 Java 클래스를 Python 런타임에 프로비저닝하고 Java 기본 인터페이스를 기반으로 합니다.

전제 조건:

  1. Java(가급적 OpenJDK 11)를 설치합니다.

  2. javac 설치

    apt-get install openjdk-11-jdk-headless
    
  3. pyjnius 모듈 설치

    pip install pyjnius==1.4.1
    

아래 예제 코드 스니펫은 Java 클래스 System에 대한 참조를 생성한 다음 Java in Python Success 입력으로 out.println static 메서드를 호출합니다.

from jnius import autoclass

autoclass("java.lang.System").out.println("Java in Python Success")

다음 명령을 사용하여 이것을 실행해 봅시다.

python main.py

출력:

Java in Python Success

Javabridge를 사용하여 Python에서 Java 호출

Javabridge 라이브러리는 Python 코드를 실행하는 데 사용할 수 있는 org.cellprofiler.javabridge.CPython Java 클래스를 로드합니다.

Python 인터프리터에서 호출하는 Java 코드 내에서 또는 Java 내에서 Java에 내장된 Python을 실행하기 위해 클래스를 사용할 수 있습니다.

다음 명령으로 Javabridge를 설치합니다.

pip install javabridge

여러 스크립트를 실행하는 동안 Python 객체에 대한 참조를 유지하는 것이 바람직할 수 있습니다. 예를 들어 다음 루틴은 Java 호출자가 실제 값에 대해 언제든지 교체할 수 있는 토큰을 사용하여 Python 값(기본 유형 또는 개체)을 참조할 수 있도록 합니다.

Java 코드는 참조의 수명을 관리합니다.

import os
import javabridge

javaclasspath = (
    [
        os.path.realpath(
            os.path.join(os.path.dirname(__file__), "..", "build", "classes")
        )
    ]
    + [os.path.realpath(os.path.join(os.path.dirname(__file__), "..", "cfg"))]
    + [
        os.path.realpath(
            os.path.join(os.path.dirname(__file__), "..", "lib", name + ".jar")
        )
        for name in ["hamcrest-core-1.1", "logback-core-0.9.28", "slf4j-api-1.6.1"]
    ]
    + javabridge.JARS
)

javabridge.start_vm(class_path=[os.pathsep.join(javaclasspath)], run_headless=True)
try:
    print
    javabridge.run_script(
        'java.lang.String.format("Hello, %s!", greetee);', dict(greetee="world")
    )
finally:
    javabridge.kill_vm()

JPype를 사용하여 Python에서 Java 호출

‘JPype’는 Python에서 완전한 Java 액세스를 제공하는 Python 모듈입니다. 이 공유 메모리 기반 솔루션은 전체 CPython 및 Java 라이브러리에 대한 액세스를 제공하면서 우수한 계산 속도를 달성합니다.

이 방법을 사용하면 Python에서 Java 스레딩 및 Java 인터페이스 구현을 사용할 수 있을 뿐만 아니라 두 시스템 간의 직접 메모리 액세스도 가능합니다.

다음 명령으로 JPype를 설치합니다.

pip install jpype1

설치가 완료되면 이제 jpype 모듈 가져오기를 시작할 수 있습니다.

import jpype as jp

jp.startJVM(jp.getDefaultJVMPath(), "-ea")
jp.java.lang.System.out.println("hello world")
jp.shutdownJVM()

Py4J를 사용하여 Python에서 Java 호출

Py4J를 사용하면 Python 인터프리터에서 실행되는 Python 애플리케이션에서 Java Virtual Machine의 Java 개체에 동적으로 액세스할 수 있습니다.

이 메서드는 Python 인터프리터에 Java 개체가 있는 것처럼 호출되며 Java 컬렉션은 표준 Python 컬렉션 메서드를 통해 액세스할 수 있습니다. Py4J는 또한 Java 프로그램이 Python 개체를 다시 호출할 수 있도록 합니다.

Py4J를 설치하려면 다음 스니펫을 실행합니다.

pip install py4j
#or
easy_install py4j

다음은 Py4J로 수행할 수 있는 작업의 짧은 스니펫입니다.

from py4j.java_gateway import JavaGateway

gateway = JavaGateway()  # connect to the JVM
java_object = gateway.jvm.mypackage.MyClass()  # invoke constructor
other_object = java_object.doThat()
other_object.doThis(1, "abc")
gateway.jvm.java.lang.System.out.println("Hello World!")

Jython과 달리 Py4J의 일부는 Python 가상 머신(VM)에서 실행되어 최신 버전의 Python으로 지속적으로 업데이트되고 Jython이 제대로 지원하지 않는 라이브러리(예: lxml)를 사용할 수 있습니다. ). 따라서 다른 부분이 실행되고 있는 Java VM을 호출해야 합니다.

Python은 JNI 대신 소켓을 통해 통신하며 Py4J에는 프로토콜이 있습니다(특정 사례 최적화, 메모리 관리 등).

Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn