파이썬에서 자바를 호출하는 가장 좋은 방법은 무엇입니까? (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는 죽은 프로젝트입니까?
다른 대안이 있습니까?
감사합니다, David
답변
이 문제에 대한 요약은 다음과 같습니다. 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()
답변
저는 최근 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에 통합 할 때 시도하는 가장 좋은 방법 일 것입니다.
답변
JPype 0.5.4.2 (2011 년 7 월)를 막 사용하기 시작했는데 잘 작동하는 것 같습니다 …
Xubuntu 10.04를 사용 중입니다.