tutorial example ejecutar desde java python jython

example - ¿Llamar a Python en Java?



jython vs python (9)

Me pregunto si es posible llamar a las funciones de Python desde el código de Java usando jython, o solo es para llamar al código de java de Python.


Aquí una biblioteca que le permite escribir sus scripts de python una vez y decidir qué método de integración (Jython, CPython / PyPy vía Jep y Py4j) usar en tiempo de ejecución:

github.com/subes/invesdwin-context-python

Dado que cada método tiene sus propios beneficios / inconvenientes como se explica en el enlace.


Depende de a qué te refieres con las funciones de Python? si fueron escritos en cpython no puedes llamarlos directamente tendrás que usar JNI , pero si fueron escritos en Jython puedes llamarlos fácilmente desde Java, ya que jython finalmente genera código de byte de Java.

Ahora cuando digo escrito en cpython o jython no tiene mucho sentido porque Python es python y la mayoría del código se ejecutará en ambas implementaciones a menos que esté utilizando bibliotecas específicas que dependan de cpython o java.

ver aquí cómo usar el intérprete de Python en Java.


Dependiendo de sus requisitos, las opciones como XML-RPC podrían ser útiles, que se pueden usar para llamar funciones de forma remota prácticamente en cualquier idioma que admita el protocolo.


Jython tiene algunas limitaciones:

Hay una serie de diferencias. Primero, los programas Jython no pueden usar módulos de extensión CPython escritos en C. Estos módulos generalmente tienen archivos con la extensión .so, .pyd o .dll. Si desea utilizar dicho módulo, debe buscar un equivalente escrito en Python o Java puro. Aunque es técnicamente posible admitir dichas extensiones, IronPython lo hace, no hay planes para hacerlo en Jython.

¿Distribuir mis scripts de Python como archivos JAR con Jython?

simplemente puede invocar scripts de python (o scripts bash o Perl) desde Java utilizando Runtime o ProcessBuilder y pasar la salida a Java:

Ejecutando un script bash shell en java

Ejecutando línea de comando en Java

java runtime.getruntime () obteniendo salida de la ejecución de un programa de línea de comando


No es inteligente tener código python dentro de Java. Envuelva su código python con matraz u otro marco web para hacerlo como un microservicio. Haga que su programa java pueda llamar a este microservicio (p. Ej., Mediante REST).

Créeme, esto es muy simple y te ahorrará toneladas de problemas. Y los códigos están ligeramente acoplados, por lo que son escalables.


Oye, pensé que ingresaría mi respuesta a esto aunque sea tarde. Creo que hay algunas cosas importantes que considerar primero con qué fuerza desea tener la vinculación entre Java y Python.

En primer lugar, ¿solo desea llamar a funciones o realmente desea que el código python cambie los datos en sus objetos java? Esto es muy importante. Si solo quieres llamar a un código python con o sin argumentos, entonces eso no es muy difícil. Si sus argumentos son primitivos, lo hace aún más fácil. Sin embargo, si desea que la clase java implemente funciones miembro en python, que cambian los datos del objeto java, entonces esto no es tan fácil ni sencillo.

En segundo lugar, ¿estamos hablando de cpython o lo hará jython? Yo diría que cpython es donde está! Yo recomendaría que esto es por qué Python es tan kool! Sin embargo, tener tales altas abstracciones tiene acceso a c, c ++ cuando es necesario. Imagina si pudieras tener eso en Java. Esta pregunta ni siquiera vale la pena preguntar si jython está bien porque de todos modos es fácil.

Así que he jugado con los siguientes métodos y los he enumerado de fácil a difícil:

Java a Jython

Ventajas: Trivially easy. Tener referencias reales a objetos Java

Desventajas: sin CPython, ¡extremadamente lento!

Jython de Java es muy fácil, y si esto es realmente suficiente, entonces genial. Sin embargo, es muy lento y no cpython! Vale la pena vivir la vida sin cpython. ¡No lo creo! Puede tener fácilmente código python implementando sus funciones miembro para sus objetos java.

Java a Jython a CPython a través de Pyro

Pyro es el módulo de objeto remoto para python. Usted tiene algún objeto en un intérprete cpython, y puede enviarle objetos que se transfieren mediante serialización y también puede devolver objetos mediante este método. Tenga en cuenta que si envía un objeto python serializado desde jython y luego llama a algunas funciones que cambian los datos en sus miembros, entonces no verá esos cambios en java. Solo necesita recordar enviar los datos que desea de pyro. ¡Esta es la manera más fácil de llegar a cpython! No necesitas ningún jni o jna o swig o .... No necesitas saber c, o c ++. kool ¿eh?

Ventajas: acceso a cpython, no tan difícil como los siguientes métodos

Desventajas: No se pueden cambiar los datos de los miembros de los objetos java directamente desde python. Es algo indirecto, (jython es el hombre medio).

Java a C / C ++ a través de JNI / JNA / SWIG a Python a través del intérprete incorporado (¿tal vez usando las bibliotecas BOOST?)

Dios mío, este método no es para los débiles de corazón. Y puedo decirles que me ha llevado mucho tiempo lograr esto con un método decente. La razón principal por la que querrías hacer esto es para que puedas ejecutar el código cpython que tiene el control completo sobre tu objeto java. Hay importantes cosas importantes a considerar antes de decidirse a probar y pan java (que es como un chimpancé) con pitón (que es como un caballo). En primer lugar, si bloqueas el intérprete que está apagado para tu programa. ¡Y no me hagas comenzar con problemas de simultaneidad! Además, hay un lote asignado de caldera, creo que he encontrado la mejor configuración para minimizar esta caldera, pero aún así es asignada. Entonces, cómo hacer esto: considere que C ++ es su intermediario, ¡sus objetos son en realidad objetos de C ++! Es bueno que lo sepas ahora. Simplemente escriba su objeto como si fuera su programa como en cpp not java, con los datos a los que desea acceder desde ambos mundos. Luego puede usar el generador de envoltura llamado swig ( http://www.swig.org/Doc1.3/Java.html ) para hacer que sea accesible para Java y compilar un archivo DLL al que llame System.load (dll nombre aquí) en Java. Haz que esto funcione primero, luego pasa a la parte difícil. Para llegar a Python, necesitas insertar un intérprete. Primero sugiero hacer algunos programas de intérprete de saludo o este tutorial Incrustar python en C / C. ¡Una vez que tengas ese trabajo, es hora de bailar el caballo y el mono! Puede enviarle objetos c ++ a python a través de [boost] [3]. Sé que no te he dado el pez, simplemente te dije dónde encontrar el pez. Algunos consejos para tener en cuenta para esto al compilar.

Cuando compile impulso, tendrá que compilar una biblioteca compartida. Y debe incluir y vincular a las cosas que necesita de jdk, es decir, jawt.lib, jvm.lib, (también necesitará el cliente jvm.dll en su ruta al iniciar la aplicación), así como python27.lib o lo que sea y el boost_python-vc100-mt-1_55.lib. Luego incluya Python / include, jdk / include, boost y solo use bibliotecas compartidas (dlls); de lo contrario, el boost tiene una función llorosa. Y sí, lleno, lo sé. Hay tantas formas en que esto puede ir mal. Así que asegúrate de hacer cada cosa bloque por bloque. Luego júntalos.


Puede llamar a cualquier idioma desde Java utilizando JNI


Puede llamar fácilmente a las funciones de python desde el código de Java con Jython. Eso es mientras su código python se ejecute bajo jython, es decir, no use algunas extensiones c que no sean compatibles.

Si eso funciona para usted, sin duda es la solución más simple que puede obtener. De lo contrario, puede usar org.python.util.PythonInterpreter desde el nuevo soporte de intérprete Java6.

Un simple ejemplo de la parte superior de mi cabeza, pero debería funcionar, espero: (no se realizaron comprobaciones de errores para abreviar)

PythonInterpreter interpreter = new PythonInterpreter(); interpreter.exec("import sys/nsys.path.append(''pathToModules if they are not there by default'')/nimport yourModule"); // execute a function that takes a string and returns a string PyObject someFunc = interpreter.get("funcName"); PyObject result = someFunc.__call__(new PyString("Test!")); String realResult = (String) result.__tojava__(String.class);


Varias de las respuestas mencionan que puede usar JNI o ​​JNA para acceder a cpython, pero no recomendaría comenzar desde cero porque ya hay bibliotecas de código abierto para acceder a cpython desde Java. Por ejemplo: