Python에서 Java 호출
-
Pyjnius
를 사용하여 Python에서 Java 호출 -
Javabridge
를 사용하여 Python에서 Java 호출 -
JPype
를 사용하여 Python에서 Java 호출 -
Py4J
를 사용하여 Python에서 Java 호출
이전 기사에서 우리는 Jython
을 사용하여 Python에서 Java를 호출하는 방법을 다뤘습니다. 자세한 내용은 이 링크에서 읽을 수 있습니다.
그러나 Python에서 Java를 호출하는 방법에는 여러 가지가 있습니다. 따라서 이 기사에서는 Python에서 Java를 호출하는 여러 가지 방법에 대해 설명합니다.
Pyjnius
를 사용하여 Python에서 Java 호출
‘Pyjnius’는 리플렉션을 사용하여 Java 클래스를 Python 런타임에 프로비저닝하고 Java 기본 인터페이스를 기반으로 합니다.
전제 조건:
-
Java(가급적 OpenJDK 11)를 설치합니다.
-
javac
설치apt-get install openjdk-11-jdk-headless
-
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 specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn