Saltar al contenido

¿Llamar a Python en Java?

Este team de especialistas pasados muchos días de investigación y recopilar de información, encontramos la solución, queremos que te sea útil en tu plan.

Solución:

Jython: Python para la plataforma Java – http://www.jython.org/index.html

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

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

Un ejemplo simple de la parte superior de mi cabeza, pero debería funcionar, espero: (no se realizó una verificación de errores por brevedad)

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import sysnsys.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);

Oye, pensé que escribiría mi respuesta a esto aunque sea tarde. Creo que hay algunas cosas importantes a considerar primero con qué tan fuerte 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 desea llamar a un código de Python con o sin argumentos, 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 directo.

En segundo lugar ¿estamos hablando de cpython o jython servirá? ¡Yo diría que cpython está donde está! Yo recomendaría que esta es la razón por la cual Python es tan genial. Sin embargo, al tener abstracciones tan altas, acceda a c, c ++ cuando sea necesario. Imagina si pudieras tener eso en java. Ni siquiera vale la pena hacer esta pregunta 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: Trivialmente fácil. 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 tiene cpython! ¿Vale la pena vivir la vida sin cpython? ¡No lo creo! Puede hacer que el código python implemente fácilmente 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. Tiene algún objeto en un intérprete de cpython, y puede enviarle objetos que se transfieren a través de la serialización y también puede devolver objetos a través de 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 debe recordar devolver los datos que desea de Pyro. ¡Creo que esta es la forma más fácil de llegar a cpython! No necesita jni o jna o swig o …. No necesita saber nada de c o c ++. genial 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 intermediario).

Java a C/C++ a través de JNI/JNA/SWIG a Python a través del intérprete integrado (¿quizás usando bibliotecas BOOST?)

Dios mío, este método no es para los débiles de corazón. Y puedo decirte que me ha llevado mucho tiempo lograr esto con un método decente. La razón principal por la que querría hacer esto es para que pueda ejecutar el código cpython que tiene control total sobre su objeto java. Hay cosas importantes a tener en cuenta antes de decidir probar y empanar java (que es como un chimpancé) con python (que es como un caballo). ¡En primer lugar, si bloquea el intérprete que se apaga para su programa! ¡Y no me hagas empezar con los problemas de concurrencia! Además, hay una gran cantidad de calderas, creo que he encontrado la mejor configuración para minimizar esta caldera, ¡pero aún así es una gran cantidad! Entonces, ¿cómo hacer esto? Considere que C ++ es su intermediario, ¡sus objetos son en realidad objetos de C ++! Qué bueno que lo sepas ahora. Simplemente escriba su objeto como si su programa estuviera en cpp no ​​en java, con los datos a los que desea acceder desde ambos mundos. Luego, puede usar el generador de contenedores llamado swig (http://www.swig.org/Doc1.3/Java.html) para que sea accesible para Java y compilar un dll al que llama System.load (nombre de dll aquí) en Java. ¡Haz que esto funcione primero, luego pasa a la parte difícil! Para llegar a python, necesita incrustar un intérprete. En primer lugar, sugiero hacer algunos programas de interpretación de hola o este tutorial Incrustar python en C/C. ¡Una vez que tengas eso funcionando, es hora de hacer que el caballo y el mono bailen! Puede enviar su objeto c ++ a python a través de [boost][3] . Sé que no te he dado el pescado, simplemente te dije dónde encontrarlo. Algunos consejos a tener en cuenta para esto al compilar.

Cuando compile boost, deberá compilar una biblioteca compartida. Y debe incluir y vincular 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 boost_python-vc100-mt-1_55.lib. Luego incluya Python/include, jdk/include, boost y solo use bibliotecas compartidas (dlls); de lo contrario, boost tiene lágrimas. Y sí, completo, lo sé. Hay tantas maneras en que esto puede salir mal. Así que asegúrese de hacer cada cosa bloque por bloque. Luego póngalos juntos.

No es inteligente tener código Python dentro de Java. Envuelva su código python con un matraz u otro marco web para convertirlo en un microservicio. Haga que su programa Java pueda llamar a este microservicio (por ejemplo, a través de REST).

Créeme, esto es mucho más simple y te ahorrará toneladas de problemas. Y los códigos están débilmente acoplados para que sean escalables.

Actualizado el 24 de marzo de 2020: según el comentario de @stx, el enfoque anterior no es adecuado para la transferencia masiva de datos entre el cliente y el servidor. Aquí hay otro enfoque que recomendé: conectar Python y Java con Rust (C/C++ también está bien). https://medium.com/@shmulikamar/https-medium-com-shmulikamar-conectando-python-y-java-con-rust-11c256a1dfb0

Reseñas y valoraciones de la guía

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *