2009-07-22 13 views
52

Duplicar posibles:
Java Python Integrationutilizar Python desde dentro de Java

que tienen una gran base de código existente escrito en Java 100%, pero me gustaría utilizar Python para algunas nuevas secciones de la misma. Necesito hacer algo de procesamiento de texto y lenguaje, y prefiero usar Python y una biblioteca como NLTK para hacer esto.

Conozco el proyecto Jython, pero parece que esto representa una forma de usar Java y sus bibliotecas desde Python, y no al revés: ¿me equivoco al respecto?

Si no, ¿cuál sería el mejor método para la interfaz entre Java y Python, de modo que (idealmente) puedo llamar a un método en Python y obtener el resultado devuelto a Java?

Gracias.

+0

Ver http://stackoverflow.com/questions/1119696/java-python-integration –

+0

buena suerte con su proyecto ... si Si tienes éxito, tal vez dejes de hacer mi pregunta y dale un poco de amor ... responde: http://stackoverflow.com/questions/1075905/class-file-from-jython-with-pydev – Victor

Respuesta

33

Soy consciente del proyecto Jython, pero parece que esto representa una manera de uso de Java y sus bibliotecas desde dentro Python, en lugar de a la inversa redonda - estoy equivocado acerca de esto?

Sí, estás equivocado. Puede call a command line interpreter para ejecutar código python usando Jyton o use python code from Java.En el pasado también existía un compilador de python a Java, pero se suspendió con Jython 2.2

+0

Gracias? Me gusta el enfoque de intérprete con la mejor interfaz, pero tendré que hacer un pregunto si puedo pagar el golpe de rendimiento versus un enfoque compilado. Pero gracias y todos los que responden. – Liam

+7

Solo para agregar que el enfoque de jythonc ha quedado en desuso en favor de llamar directamente al intérprete de Python – dgorissen

+1

¿Para cosas simples, todavía necesitarías el entorno python/libraries/etc instalado en tu sistema? – nsn

0

Simplemente ejecute el intérprete de Python como un subproceso desde Java.

Escriba la funcionalidad de Python como una secuencia de comandos adecuada, que se lee desde stdin y escribe en stdout.

Utilice la clase Java Runtime para generar un subproceso que ejecute su secuencia de comandos de Python. Esto es muy simple de hacer y proporciona una interfaz muy limpia.


Editar

import simplejson 
import sys 
for request in sys.stdin.readlines(): 
    args = simplejson.loads(request) 
    result = myFunction(args['this'], args['that']) 
    sys.stdout.writeline(simplejson.dumps(result) + "\n") 

La interfaz es sencilla, gastos generales estructurada y muy bajo.

+1

Esto no es realmente Una buena forma de interactuar entre los 2, no podrán llamar a un método en Pyton y hacer que salga en Java. –

+0

Diría que la interfaz es lo contrario de clean, ya que la comunicación está completamente desestructurada y requiere una lógica de análisis adicional. –

+0

De acuerdo: Puede ser un poco complicado usando Java Runtime: evítelo a menos que realmente tenga que hacerlo. Debe tener cuidado de no presentar problemas de portabilidad, debe manejar el estado de devolución; es posible que tenga que manejar procesos de mala conducta, etc. Pierdes mucho control haciendo esto. – monojohnny

2

Jython es una implementación de Python que se ejecuta en la JVM. Puede encontrar información sobre la incrustación de Python en una aplicación Java existente en el user guide.

No conozco el entorno en el que está trabajando, pero tenga en cuenta que mezclar idiomas en la misma aplicación puede llevar rápidamente a un desastre. Recomiendo crear interfaces Java para representar las operaciones que planea usar, junto con las clases de implementación empaquetadas por separado que envuelven el código de Python.

6

Escribo un módulo de Python para manejar el procesamiento de texto y lenguaje, y luego construyo un pequeño puente en jython con el que su programa Java puede interactuar. El puente jython será muy simple, solo es realmente responsable de reenviar llamadas al módulo python y devolver la respuesta del módulo python al módulo java. Jython es realmente fácil de usar, y la configuración no debería demorar más de 15 minutos.

¡La mejor de las suertes!

+0

me gusta esta idea. ¿Puede apuntar a un ejemplo pls – KillBill

+0

o bien, por qué necesita jython para llamar a un script de Python cuando puede usar Process.exe o ProcessBuilder – KillBill

2

En mi opinión, Jython es exactamente lo que está buscando.
Es una implementación de Python dentro de la JVM; como tal, puede intercambiar libremente objetos y, por ejemplo, heredar de una clase Java (con algunas limitaciones).

Tenga en cuenta que su mayor punto de fortaleza (estar en la parte superior de JVM) es también su mayor inconveniente, porque no puede usar todas las extensiones de C (C) escritas en C (o en cualquier otro lenguaje compilado); esto puede tener un impacto en lo que está dispuesto a hacer con su procesamiento de texto.

Para obtener más información acerca de lo que es Jython, su potencial y sus limitaciones, le sugiero que lea Jython FAQ.

4

No creo que pueda usar NLTK desde Jython, ya que depende de Numpy que no está portado a la JVM. Si necesita NLTK o cualquier otra extensión de CPython nativa, puede considerar usar algún mecanismo de IPC para comunicarse entre CPython y la JVM. Dicho esto, hay un proyecto para permitir llamar CPython desde Java, llamado Jepp:

http://jepp.sourceforge.net/

La inversa (código de llamada Java desde CPython) es el objetivo de JPype y JavaClass:

SourceForge. net/proyectos/jpype/

pypi.python.org/pypi/javaclass/0.1

nunca he utilizado ninguno de estos proyectos, por lo que cant't voto por su calidad.

0

Recuerde comprobar primero a los que pagan por el desarrollo que están de acuerdo con la base de código que necesita un desarrollador que conozca Python y Java a partir de ahora, y otros costos y efectos de mantenimiento que sin duda ya ha contabilizado.

Ver: http://www.acm.org/about/se-code 1,06, 2,03, 2,09, 4,03, 4,05, 6,07

Cuestiones relacionadas