versus java python

versus - python vs java 2017



Llamar a Java desde Python (9)

Últimamente he estado integrando muchas cosas en Python, incluido Java. El método más robusto que he encontrado es usar IKVM y un contenedor C #.

IKVM tiene una pequeña aplicación ordenada que le permite tomar cualquier Java JAR y convertirlo directamente a .Net DLL. Simplemente traduce el bytecode de JVM a bytecode de CLR. Ver http://sourceforge.net/p/ikvm/wiki/Ikvmc/ para más detalles.

La biblioteca convertida se comporta como una biblioteca C # nativa, y puede usarla sin necesidad de la JVM. A continuación, puede crear un proyecto envoltorio de DLL C # y agregar una referencia a la DLL convertida.

Ahora puede crear algunos talones de envoltura que llamen a los métodos que desea exponer, y marque esos métodos como DllEport. Ver https://stackoverflow.com/a/29854281/1977538 para más detalles.

La DLL contenedora actúa como una biblioteca C nativa, con los métodos exportados como los métodos C exportados. Puede conectarse a ellos usando ctype como de costumbre.

Lo probé con Python 2.7, pero debería funcionar con 3.0 también. Funciona en Windows y Linux

Si usa C #, entonces este es probablemente el mejor enfoque para intentar integrar casi cualquier cosa en python.

¿Cuál es la mejor manera de llamar a Java desde Python? (jython y RPC no son una opción para mí).

He oído hablar de JCC: http://pypi.python.org/pypi/JCC/1.9 un generador de código C ++ para llamar Java desde C ++ / Python. Pero esto requiere compilar todas las llamadas posibles; Yo preferiría otra solución.

He oído hablar de JPype: http://jpype.sourceforge.net/ tutorial: 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()

Esto se ve como lo que necesito. Sin embargo, el último lanzamiento es de enero de 2009 y veo personas que no compilan JPype.

¿JPype es un proyecto muerto?

¿Hay otras alternativas?

Saludos, David


A través de mi propia experiencia, al tratar de ejecutar algunos códigos java desde dentro de python, de manera similar a como se ejecuta el código python dentro del código java en python, no pude encontrar una metodología directa.

Mi solución a mi problema fue ejecutar este código java como scripts de beans llamando al intérprete de beanshell como un comando de shell desde mi código de python después de editar el código de Java en un archivo temporal con los paquetes y variables apropiados.

Si de lo que estoy hablando es útil de alguna manera, me complace ayudarlo a compartir más detalles de mis soluciones.


Aquí está mi resumen de este problema: 5 formas de llamar a Java desde Python

http://baojie.org/blog/2014/06/16/call-java-from-python/ (en caché )

Respuesta corta: Jpype funciona bastante bien y está probado en muchos proyectos (como python-boilerpipe), pero Pyjnius es más rápido y simple que JPype

He intentado Pyjnius / Jnius, JCC, javabridge, Jpype y Py4j.

Py4j es un poco difícil de usar, ya que necesita iniciar una puerta de enlace, agregando otra capa de fragilidad.


Estoy comenzando a usar JPype 0.5.4.2 (julio de 2011) y parece que está funcionando bien ...
Estoy en Xubuntu 10.04


Estoy en OSX 10.10.2 y logré usar JPype.

Se topó con problemas de instalación con Jnius ( otros también ), Javabridge instalado pero dio misteriosos errores cuando traté de usarlo, PyJ4 tiene este inconveniente de tener que iniciar primero un servidor Gateway en Java, JCC no se instaló. Finalmente, JPype terminó trabajando. Hay un fork mantenido de JPype en Github. Tiene las principales ventajas de que (a) se instala correctamente y (b) puede convertir matrices Java de una manera muy eficiente a numpy array ( np_arr = java_arr[:] )

El proceso de instalación fue:

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

Y deberías poder import jpype

La siguiente demostración funcionó:

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

Cuando intenté llamar a mi propio código Java, primero tuve que compilar ( javac ./blah/HelloWorldJPype.java ), y tuve que cambiar la ruta JVM del valor predeterminado (de lo contrario, obtendría inexplicables errores de "clase no encontrada") . Para mí, esto significaba cambiar el comando startJVM a:

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 ...


Pyjnius.

Documentos: http://pyjnius.readthedocs.org/en/latest/

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

De la página de github:

Un módulo de Python para acceder a las clases de Java como clases de Python usando JNI.

PyJNIus es un "trabajo en progreso".

Vista rápida

>>> 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


Si estás en Python 3, hay un fork de JPype llamado JPype1-py3

pip install JPype1-py3

Esto funciona para mí en OSX / Python 3.4.3. (Es posible que necesite export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version )

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


Supongo que si puedes pasar de C ++ a Java, entonces ya estás listo. He visto un producto del tipo que mencionas que funciona bien. CodeMesh la casualidad que el que usamos fue CodeMesh . No estoy respaldando específicamente a este proveedor ni haciendo ninguna declaración sobre la calidad relativa de su producto, pero lo he visto funcionar en un escenario de gran volumen.

En general, diría que, si es posible, le recomendaría que se mantenga alejado de la integración directa a través de JNI si puede. Algún enfoque simple de servicio REST o arquitectura basada en colas tenderá a ser más simple de desarrollar y diagnosticar. Puede obtener un rendimiento bastante decente si utiliza dichas tecnologías desacopladas con cuidado.


También Py4J usar Py4J . Hay un ejemplo en la página principal y mucha documentación, pero esencialmente, simplemente llama a los métodos Java desde su código python como si fueran métodos de Python:

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

A diferencia de Jython, una parte de Py4J se ejecuta en la máquina virtual de Python, por lo que siempre está "actualizada" con la última versión de Python y puede utilizar bibliotecas que no se ejecutan bien en Jython (por ejemplo, lxml). La otra parte se ejecuta en la máquina virtual Java a la que desea llamar.

La comunicación se realiza a través de sockets en lugar de JNI y Py4J tiene su propio protocolo (para optimizar ciertos casos, administrar la memoria, etc.)

Descargo de responsabilidad: soy el autor de Py4J