2009-07-13 11 views
40

Tengo una aplicación Java que necesita integrarse con una biblioteca de terceros. La biblioteca está escrita en Python, y no puedo opinar sobre eso. Estoy tratando de descubrir la mejor manera de integrarme con eso. Estoy probando JEPP (Java Embedded Python). ¿Alguien ha usado eso antes? Mi otro pensamiento es usar JNI para comunicarme con los enlaces de C para Python.Integración de Java Python

Se agradecerá cualquier idea sobre la mejor manera de hacerlo. Gracias.

+1

Si la biblioteca de python está escrita en python puro, ¿qué hay de usar Jython? – fabrizioM

Respuesta

28

¿Por qué no utilizar Jython? El único inconveniente que puedo pensar inmediatamente es si su biblioteca utiliza extensiones nativas CPython.

EDIT: Si puede usar Jython ahora, pero cree que puede tener problemas con una versión posterior de la biblioteca, le sugiero que intenta aislar a la biblioteca de su aplicación (por ejemplo, algún tipo de interfaz de adaptador). Vaya con la cosa más simple que funciona por el momento, luego considere JNI/CPython/etc si y cuando lo necesite. Hay poco que ganar yendo por la (dolorosa) ruta JNI a menos que realmente tengas que hacerlo.

+0

He visto las bibliotecas Jython. El problema es que no tengo ninguna garantía de que las bibliotecas que estoy usando no usen (o no lo hagan en el futuro) extensiones nativas. –

+0

Haré eso. Gracias. ¿Debo agregar algo especial a un archivo py para ejecutarlo con Jython? O si es una python nativa, ¿debería ejecutarse? –

+0

No tengo mucha experiencia con Jython. Consulte los documentos :) –

4

¿Ha considerado ejecutar Jython en Java VM?

+0

IronPython es para .NET, no Java. IKVM podría unir a los tres potencialmente, pero ick :) –

+0

Sí, tengo mis cables cruzados. – cletus

+1

¿Me he perdido una referencia a IronPython en otro lugar? –

4

Se puede usar un servicio de mensajería como ActiveMQ. Tiene soporte tanto de Python como de Java. De esta forma, puede dejar las complicadas vinculaciones JNI o ​​C tal como están y tratar únicamente con lo que considero una interfaz simple. Además, cuando la biblioteca se actualiza, no necesita cambiar mucho, en todo caso.

13

Francamente la mayoría de las formas de ejecutar Python directamente desde dentro de JVM no funcionan. No son bastante compatibles (la nueva versión de la biblioteca de terceros puede usar las funciones de Python 2.6 y no funcionará con Jython 2.5) o hacky (se romperá con una pila de JVM críptica que no conducirá realmente a la solución).

Mi forma preferida de integrar los dos sería usar RPC. XML RPC no es una mala elección aquí, si tiene cantidades moderadas de datos. Es bastante compatible con — Python lo tiene en su biblioteca estándar. Las bibliotecas de Java también son fáciles de encontrar. Ahora, dependiendo de su configuración, la parte de Java o Python sería un servidor que acepte la conexión de otro idioma.

Una manera alternativa menos popular que vale la pena considerar para hacer RPC es Google protobuffers, que tienen 2/3 de soporte para nice rpc. Solo necesita proporcionar su capa de transporte. No es mucho trabajo y la conveniencia de escribir es razonable.

Otra opción es escribir un envoltorio en C sobre las piezas de la funcionalidad de Python que necesita exponer en Java y usarlo a través de los complementos nativos de JVM. Puede aliviar el dolor yendo con SWIG SWIG.

En esencia, en su caso, funciona así:

  1. crear una interfaz SWIG para todas las llamadas a métodos de Java a C++.
  2. Crea el código C/C++ que recibirá tus llamadas y llama internamente al intérprete de python con los parámetros adecuados.
  3. Convertir la respuesta que obtienes de python y enviarla a través de swig a tu código Java.

Esta solución es bastante compleja, un poco exagerada en la mayoría de los casos. Aún así, vale la pena hacerlo si (por algún motivo) no puede pagar los RPC. RPC aún sería mi elección preferida, sin embargo.

+5

Esta compatibilidad que no es JVM es la mayor deficiencia de Python. Por eso decidimos usar Scala. Es aún mejor – Jus12

+0

Marcin, el modo de llamada remota no es deseable para implementaciones de big data (algoritmos o aplicaciones) por razones de rendimiento y escalabilidad. De hecho, "no es lo suficientemente compatible" es un problema, pero "romper con la pila de JVM críptica" requiere algunas explicaciones y ejemplos, por favor. ¿Quiere decir difícil de depurar o no se ejecuta? Estoy probando Jep, que hace JNI en proceso y parece ser lo mejor. https://github.com/mrj0/jep/wiki/How-Jep-Works. ¿Pensamientos? – SemanticBeeng

7

Mi otro pensamiento es usar JNI para comunicarme con los enlaces de C para Python.

me gusta mucho JNA:

JNA proporciona programas Java fácil acceso a bibliotecas nativas compartidas (DLL) en Windows sin escribir nada, pero se requiere de código Java sin JNI o ​​código nativo. Esta funcionalidad es comparable a Platform/Invoke de Windows y ctypes de Python. El acceso es dinámico en tiempo de ejecución sin generación de código.

Mi 0,02 $ :)

4

Muchos años más tarde, sólo para añadir una opción que es más popular en estos días ...

Si necesita una funcionalidad CPython, py4j es una buena opción . py4j ha visto actualizaciones frecuentes en 2017 y ha ganado algo de popularidad, porque se usa p. ej. por Apache Spark para lograr CPython interoperability.

+1

Es una opción realmente mejor que Jython, que es un callejón sin salida tecnológico y parece que ya no se mantiene. –

Cuestiones relacionadas