2012-01-17 79 views
70

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?¿Llamar a Python en Java?

+2

Por favor, eche un vistazo a una pregunta similar y lea la respuesta. http://bytes.com/topic/python/answers/22390-executing-jython-function-java – AlexR

Respuesta

72

Usted puede llamar fácilmente las funciones de Python de código 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 del nuevo soporte de intérprete Java6.

Un ejemplo sencillo de la parte superior de mi cabeza - pero debería funcionar espero: (sin comprobación de errores hecho por razones de brevedad)

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); 
+0

He instalado JYthon, o supongo que lo hice, y sigo tratando de ejecutar el código que delineaste, pero lo destacó como un error. ¿La instalación de Jython necesita ir a una carpeta específica, ya sea en las carpetas python o java? – Shahab

+1

@Shahab No es realmente útil si no dice qué error aparece .. – Voo

+0

No hay ningún error, solo estoy teniendo dificultades para integrar Jython en Netbeans – Shahab

3

puede llamar a cualquier lenguaje de Java usando Java Native Interface

+6

Cualquier lenguaje que se pueda llamar desde c que sea. Bueno, ok, python puede, pero Jython es realmente una solución mucho más simple (o usa el PyInterpreter en j6 +). No es tan trivial escribir el código para llamar a las funciones de Python desde c. – Voo

4

Depende de lo qué se refiere con las funciones de Python? si fueron escritos en cpython no puede llamarlos directamente, tendrá que usar JNI, pero si fueron escritos en Jython puede llamarlos fácilmente desde Java, ya que jython finalmente genera el 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 se basan en cpython o java.

ver aquí how to use Python interpreter in Java.

3

Dependiendo de sus necesidades, opciones como XML-RPC podrían ser útiles, que pueden utilizarse para llamar a funciones de forma remota prácticamente en cualquier lenguaje que soporte el protocolo.

37

Hola, pensé que iba a ingresar 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 las 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 cpython o will jython do? 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 han jugado con los métodos siguientes, y los enumerados de fácil a difícil:

Java para Jython

Ventajas: Trivialmente fácil. Tener referencias reales a objetos java

Desventajas: Sin CPython, Extremadamente lento!

Jython de java es tan 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 para Jython a través CPython Pyro

Pyro es el módulo de objeto remoto para el pitón. 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: El acceso a CPython, no es tan difícil como métodos siguientes

Desventajas: No es posible cambiar los datos de los miembros de objetos Java directamente desde Python. Es algo indirecto, (jython es el hombre medio).

Java para C/C++ a través de JNI/JNA/TRAGO a Python a través de intérprete incorporado (tal vez usando bibliotecas Boost?)

OMG 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 hacerlo: 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 dll al que llame System.load (nombre dll aquí) en java. Haz que esto funcione primero, luego pasa a la parte difícil. Para llegar a Python, necesita insertar un intérprete. En primer lugar, sugiero hacer algunos programas de intérprete hola o este tutorial . ¡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 boost, necesitará 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, 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.

+2

Aquí una biblioteca que le permite escribir sus scripts de python una vez y decidir qué método de integración (Jython, CPython a través de Jep y Py4j) usar en tiempo de ejecución: https://github.com/subes/invesdwin-context-python Dado que cada método tiene sus propios beneficios/inconvenientes – subes

+0

@subes ese proyecto se ve increíble Escribí esto hace un tiempo. Te animo a que escribas una respuesta, la renunciaré. No me gusta la respuesta superior jaja porque no creo que proporciona mucha información útil fuera de una búsqueda en google. – Snickers3192

+0

Creé una respuesta por separado – subes

1

Jython tiene algunas limitaciones:

There are a number of differences. First, Jython programs cannot use CPython extension modules written in C. These modules usually have files with the extension .so, .pyd or .dll. If you want to use such a module, you should look for an equivalent written in pure Python or Java. Although it is technically feasible to support such extensions - IronPython does so - there are no plans to do so in Jython.

Distributing my Python scripts as JAR files with Jython?

sólo tiene que llamar scripts de Python (o fiesta o scripts de Perl) de Java utilizando el tiempo de ejecución o ProcessBuilder y pasar la salida de nuevo a Java:

Running a bash shell script in java

Running Command Line in Java

java runtime.getruntime() getting output from executing a command line program

0

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 (por ejemplo, mediante REST).

Beleive me, esto es muy simple y le ahorrará toneladas de problemas. Y los códigos están ligeramente acoplados, por lo que son escalables.

3

En varias de las respuestas se menciona 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:

2

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

https://github.com/subes/invesdwin-context-python

Puesto que cada método tiene sus propios beneficios/inconvenientes como explicado en el enlace.

+0

Proyecto realmente genial. – Snickers3192