IT

자바에서 자바 호출하기

lottoking 2020. 7. 22. 07:45
반응형

자바에서 자바 호출하기


어디에서 Java를 호출하는 가장 좋은 방법은 무엇입니까? (jython과 RPC는 옵션이 아닙니다).

JCC에 대해 들었습니다. http://pypi.python.org/pypi/JCC/1.9 C ++ / Python에서 Java를 호출하기위한 C ++ 코드 생성기 그러나 가능한 모든 호출을 수행해야합니다. 다른 솔루션을 선호합니다.

JPype에 대해 들었습니다 : http://jpype.sourceforge.net/ 튜토리얼 : http://www.slideshare.net/onyame/mixing-python-and-java

import jpype 
jpype.startJVM(path to jvm.dll, "-ea") 
javaPackage = jpype.JPackage("JavaPackageName") 
javaClass = javaPackage.JavaClassName 
javaObject = javaClass() 
javaObject.JavaMethodName() 
jpype.shutdownJVM() 

이것은 내가 필요한 것입니다. 그러나 마지막 릴리스는 2009 년 1 월이며 JPype를 믿지 못하는 사람들이 있습니다.

JPype는 죽은 프로젝트입니까?

다른 대안이 있습니까?

감사합니다, 데이비드


이 문제에 대한 요약은 다음과 가변합니다. Python에서 Java를 호출하는 5 가지 방법

http://baojie.org/blog/2014/06/16/call-java-from-python/ ( 캐시 됨 )

짧은 대답 : Jpype는 꽤 잘 작동하며 많은 프로젝트 (예 : python-boilerpipe)에서 Pyjnius는 JPype보다 간단합니다.

Pyjnius / Jnius, JCC, javabridge, Jpype 및 Py4j를 시도했습니다.

Py4j는 게이트웨이를 시작하고 사용하기 쉬운 계층을 추가하기 어렵습니다.


Py4J 사용할 수도 있습니다 . 첫 페이지와 많은 문서에 예제가 내장 된 코드에서 마치 Java 메소드를 마치 메소드 인 것처럼 호출하면됩니다.

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!') # call a static method

Jython과 달리 Py4J의 한 부분은 Python VM에서 실행되고 항상 최신 버전의 Python에서 "최신"상태이며 Jython에서 제대로 실행되지 않는 라이브러리 (예 : lxml)를 사용할 수 있습니다. 다른 부분은 호출하려는 Java VM에서 실행됩니다.

통신은 JNI 대신 소켓을 통해 Py4J 자체에는 프로토콜이 있습니다 (특정 사례를 최적화하고 관리하는 등).

면책 조항 : 나는 Py4J의 저자입니다


피니 우스.

문서 : http://pyjnius.readthedocs.org/en/latest/

Github : https://github.com/kivy/pyjnius

github 페이지에서 :

JNI를 사용하여 Java 클래스를 Python 클래스로 액세스하는 Python 모듈

PyJNIus는 "작업 진행 중"입니다.

빠른 개요

>>> from jnius import autoclass
>>> autoclass('java.lang.System').out.println('Hello world') Hello world

>>> Stack = autoclass('java.util.Stack')
>>> stack = Stack()
>>> stack.push('hello')
>>> stack.push('world')
>>> print stack.pop() world
>>> print stack.pop() hello

OSX 10.10.2에 인증 된 JPype 사용에 성공했습니다.

Jnius ( 다른 사람들도 마찬가지 ), Javabridge가 설치되었지만 사용하려고 할 때 신비한 오류가 발생했습니다 .PyJ4는 Java에서 게이트웨이 서버를 먼저 시작 해야하는 불편 함이 있으며 JCC가 설치되지 않습니다. 마지막으로 JPype가 작동했습니다. 있다 JPype의 유지 포크 Github에서에가. (a) 제대로 설치되고 (b) Java 배열을 numpy 배열로 매우 효율적으로 변환 할 수 있다는 주요 이점이 있습니다 ( np_arr = java_arr[:])

설치 프로세스는 다음과 같습니다.

git clone https://github.com/originell/jpype.git
cd jpype
python setup.py install

그리고 당신은 할 수 있어야합니다 import jpype

다음 데모가 작동했습니다.

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

자체 자바 코드를 호출하려고 할 때 먼저 컴파일 ( javac ./blah/HelloWorldJPype.java)해야했고 JVM 경로를 기본값에서 변경해야했습니다 (그렇지 않으면 설명 할 수없는 "클래스를 찾을 수 없음"오류가 발생합니다). 나에게 이것은 startJVM 명령을 다음과 같이 변경하는 것을 의미합니다.

jp.startJVM('/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/MacOS/libjli.dylib', "-ea")
c = jp.JClass('blah.HelloWorldJPype')  
# Where my java class file is in ./blah/HelloWorldJPype.class
...

Python 3의 경우 JPype1-py3 이라는 JPype 포크가 있습니다.

pip install JPype1-py3

이것은 OSX / Python 3.4.3에서 나를 위해 작동합니다. (필요할 수 있음 export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version)

from jpype import *
startJVM(getDefaultJVMPath(), "-ea")
java.lang.System.out.println("hello world")
shutdownJVM()

JPype 0.5.4.2 (2011 년 7 월)를 막 사용하기 시작했는데 잘 작동하는 것 같습니다 ...
Xubuntu 10.04를 사용 중입니다.


저는 최근 Java를 포함하여 많은 것을 Python에 통합했습니다. 내가 찾은 가장 강력한 방법은 IKVM과 C # 래퍼를 사용하는 것입니다.

IKVM에는 Java JAR을 가져 와서 .Net DLL로 직접 변환 할 수있는 깔끔한 작은 응용 프로그램이 있습니다. 단순히 JVM 바이트 코드를 CLR 바이트 코드로 변환합니다. 자세한 내용은 http://sourceforge.net/p/ikvm/wiki/Ikvmc/참조 하십시오 .

변환 된 라이브러리는 네이티브 C # 라이브러리처럼 작동하며 JVM없이 사용할 수 있습니다. 그런 다음 C # DLL 래퍼 프로젝트를 만들고 변환 된 DLL에 대한 참조를 추가 할 수 있습니다.

이제 노출하려는 메서드를 호출하는 래퍼 스텁을 만들고 해당 메서드를 DllEport로 표시 할 수 있습니다. 자세한 내용은 https://stackoverflow.com/a/29854281/1977538 을 참조하십시오.

래퍼 DLL은 기본 C 라이브러리처럼 작동하며 내 보낸 메서드는 내 보낸 C 메서드처럼 보입니다. 평소와 같이 ctype을 사용하여 연결할 수 있습니다.

Python 2.7에서 시도했지만 3.0에서도 작동합니다. Windows 및 Linux에서 작동

C #을 사용하는 경우 거의 모든 것을 Python에 통합 할 때 시도하는 가장 좋은 방법 일 것입니다.


나는 당신이 C ++에서 Java로 얻을 수 있다면 모든 것이 준비되었다고 가정하고 있습니다. 나는 당신이 언급 한 종류의 제품이 잘 작동하는 것을 보았습니다. 우리가 사용한 것은 CodeMesh였습니다 . 나는 특별히이 벤더를지지하거나 그들의 제품의 상대적인 품질에 대해 어떤 진술도하지 않지만, 꽤 많은 양의 시나리오에서 작동하는 것을 보았습니다.

가능한 경우 JNI를 통한 직접 통합을 피하는 것이 좋습니다. 일부 간단한 REST 서비스 접근 방식 또는 대기열 기반 아키텍처는 개발 및 진단이 더 간단한 경향이 있습니다. 이러한 분리 된 기술을주의 깊게 사용하면 꽤 괜찮은 성능을 얻을 수 있습니다.


파이썬 코드가 파이썬에서 자바 코드 내에서 실행되는 방식과 유사한 방식으로 파이썬 IA 방식에서 일부 자바 코드를 실행하려는 내 자신의 경험을 통해 직접적인 방법론을 찾을 수 없었습니다.

내 문제에 대한 나의 해결책은 적절한 패키지와 변수로 임시 파일에서 자바 코드를 편집 한 후 내 파이썬 코드 내에서 beanshell 인터프리터를 쉘 명령으로 호출하여이 자바 코드를 beanshell 스크립트로 실행하는 것입니다.

내가 말하는 것이 어떤 식 으로든 도움이된다면 내 솔루션에 대한 자세한 내용을 공유 할 수 있도록 기꺼이 도와 드리겠습니다.

참고 URL : https://stackoverflow.com/questions/3652554/calling-java-from-python

반응형