본문 바로가기
Programing/Python

JPype 사용기

by Tomining 2016. 7. 19.

설치하기

pip install C:\dev\dev_env\python\JPype1-0.6.1-cp35-none-win_amd64.whl


정상적으로 설치 되었는지는 import jpype 로 확인할 수 있습니다.
만약 아래와 같은 오류가 발생한다면 정상적으로 설치 되지 않았을 수 있습니다.

ImportError: DLL load failed: 지정된 모듈을 찾을 수 없습니다.

window 환경에서 정상적인 설치 후에도 위와 같은 오류가 발생한 경우라면 Visual C++ 재배포 가능 패키지를 다운로드하여 설치하면 해결된다는 자료가 있어 설치해 보았습니다. 그랬더니 위 오류는 해결되었으나 다른 오류가 발생하였습니다.

ImportError: numpy.core.multiarray failed to import

NumPy 가 설치되지 않아서 발생한 오류입니다. wheel 을 이용하여 설치해 줍니다.

pip install "C:\dev\dev_env\python\numpy-1.11.1+mkl-cp35-cp35m-win_amd64.whl"

다시 import jpype 를 실행해 보면 정상적으로 import 됨을 확인 할 수 있습니다.

사용하기

기존 Jar 에 있는 Java Class 를 로딩하려면 아래와 같이 진행하면 됩니다.

import os
import jpype as jp

classpath = os.pathsep.join((“jar path”, “jar2 path” …)
jp.startJVM(jp.getDefaultJVMPath(), “-ea”, “-Djava.class.path=%s” % classpath)

j_class = jp.Class(“package.class”)
jc = j_class()
jc.method() # non-static
j_class.static_method() # static

j_package = jp.JPackage(‘package’)
j_class = j_package.className()
jc = j_class()
jc.method() # non-static
j_class.static_method() # static

jp.shutdownJVM()

Jpype 사용시 주로 실수하는 부분이 몇 가지 있습니다.
  • classpath 파라메터 이름 오타
    대/소문자를 구분하기 때문에 오타로 인해 JVM 이 시작되지 못하는 경우가 있습니다.
  • jar 에 관련된 dependency jar 가 있는 경우 함께 classpath 에 잡아 주어야 합니다.
  • java method overloading 이슈
    Java 의 경우 동일한 method 이름을 갖고 있더라도 overloading 을 통해 runtime시에 동적으로 method 호출이 이루어집니다.
    하지만 Jpype 를 사용할 때에는 그 부분을 확실하게 해 주어야 합니다.
    즉, Java method 호출하는 부분에서 파라메터가 String 타입이라면 str() 을 이용하여 명시적으로 타입을 지정해 줄 수 있어야 합니다.

느낀점

테스트 시에 2가지 지점에서 주로 오류가 발생하였고, 상당히 많은 시간을 보냈습니다.
첫 번째가 startJVM 시 오류였고, 두 번째가 Java Class 를 사용하는 부분이었습니다.
그 원인에는 몇가지가 있지만 오류 발생시 노출되는 Stacktrace 로는 상세한 정보를 확인할 수 없어 불편함을 많이 느꼈습니다.



참조

'Programing > Python' 카테고리의 다른 글

PEP8 이란?  (0) 2016.07.27
APScheduler 사용기  (0) 2016.07.26
Python Intellij Project 설정시 Django 인식 오류  (0) 2016.07.14
Window 환경에서 Python VirtualEnv 사용하기  (0) 2016.07.06
Python 기초 스터디 자료  (0) 2016.03.27