2009-01-17 8 views
6

I tienen una interfaz de Python de una biblioteca gráfica escrito en C - igraph (el nombre de biblioteca). Mi necesidad es invocar los módulos de python pertenecientes a esta biblioteca de gráficos desde el código de Java. Funciona así, el núcleo de la biblioteca está en c. Este núcleo se ha importado a Python y las interfaces con las funciones integradas en core están disponibles en Python. El resto del código de mi proyecto está en Java y, por lo tanto, también me gustaría llamar a las funciones gráficas por Java. Jython - que le permite invocar módulos de Python con en Java era un option.I continuó tratando Jython para descubrir que no va a funcionar en mi caso como el código del núcleo se encuentra en C y Jython suele apoyar cualquier cosa que se importan como un C de DLL en código python. También pensé en optar por el enfoque de llamar rutinas de gráfico directamente en c. Eso es sin pasar por el código de Python. Supongo que debe haber algo que te permita llamar al código c de Java, sin embargo, no soy bueno en C, por lo tanto, no fui por eso. Mi último recurso parece ejecutar el intérprete de Python desde la línea de comandos usando Java. Pero eso es sucio y desvergonzado. También para tratar con los resultados producidos por el código de Python, tendré que escribir los resultados en un archivo y volver a leerlo en Java. De nuevo sucio. ¿Hay algo que alguien pueda sugerirme? Gracias a todos dando tiempo.módulos Invoke Python de Java


Gracias Igal por responder. Lo he visto. A primera vista, parece como si estuviera simplemente llamando al script de Python.

Jep jep = new Jep(false, SCRIPT_PATH, cl); 
jep.set("query", query); 
jep.runScript(SCRIPT_PATH + file); 
jep.close(); 

¿No es que sea muy similar a lo que haría si se llama al intérprete de Python desde la línea de comandos a través de un código Java.

Runtime runtime = Runtime.getRuntime(); 
Process proc = runtime.exec("python test.py"); 

La preocupación es cómo utilizo los resultados generados por la secuencia de comandos de Python. La forma ingenua es escribirlos en un archivo y leerlos en Java. Estoy buscando un enfoque más inteligente. Gracias por la sugerencia de todos modos.

Respuesta

4

Nunca lo intenté. Pero hace poco stumbled en un project named Jepp que pueden ser de su interés.

Jepp incrusta CPython en Java. Es seguro de usar en un entorno con muchos hilos, es bastante rápido y su estabilidad es una característica y objetivo principal.

3

Si desea llamar a las funciones C de Java, JNA (Java Native Access) es probablemente el camino a seguir. JNA le permite llamar a funciones en las bibliotecas nativas sin tener que escribir el código C de pegamento (como tendría que cuando se utiliza JNI), y automáticamente se asigna entre los tipos de datos primitivos en Java y C. Un ejemplo sencillo podría tener este aspecto:

import com.sun.jna.Native; 
import com.sun.jna.Library; 

public class PrintfWrapper { 
    public interface CLibrary extends Library { 
     CLibrary INSTANCE = (CLibrary)Native.loadLibrary("c", CLibrary.class); 
     void printf(String formatString, Object... args); 
    } 

    public static void main(String[] args) { 
     CLibrary.INSTANCE.printf("Hello, world\n"); 
    } 
} 

Sin embargo, las cosas se complicarán con igraph porque igraph usa muchas estructuras de datos que no se pueden mapear directamente en sus homólogos de Java. Hay un proyecto llamado JNAerator que debería poder generar la fuente JNA desde los archivos de encabezado de igraph, pero nunca lo he probado y es probable que los resultados aún necesiten algunos ajustes manuales.

También tenga en cuenta que un Java interface for igraph se está desarrollando lenta pero constantemente y podría llegar a ser útil en unos pocos meses o así.

2

Puede utilizar jep.getValue() para recuperar un valor del diccionario global de guión.

Existen advertencias sobre los niveles de alcance en Python, por lo que la mayoría de las personas considera más claro pasar una clase Java a python y establecer el valor de retorno en esa instancia en Python. Una vez que el script se completa, el código de Java tendrá el resultado.

Por ejemplo:

==> Java

class ReturnValueClass { 
    public int scriptResult; 
}; 
ReturnValueClass value = new ReturnValueClass(); 
jep.set("retval", value); 

==> Python

# do something 
pass 
# write the return value 
retval.scriptResult = some_python_value 

==> Java

System.out.println(value.scriptResult); 

Espero que ayude,

Mike (escribí Jep)