2010-04-20 12 views
10

estoy tratando de llamar Jython desde una aplicación Java utilizando 6 javax.script:¿Llamar a Python desde Java a través del motor de scripts (jython)?

import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 
import javax.script.ScriptException; 

public class jythonEx 
{ 
    public static void main (String args[]) throws ScriptException 
    { 
     ScriptEngineManager mgr = new ScriptEngineManager(); 
     ScriptEngine pyEngine = mgr.getEngineByName("python"); 
     try { 
      pyEngine.eval("print \"Python - Hello, world!\""); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     }  
    } 
} 

Esto está causando una NullPointerException:

java.lang.NullPointerException 
     at jythonEx.main(jythonEx.java:12) 

¿Alguien tiene alguna idea de lo que estoy haciendo mal aquí?

Editar:

Gracias por las respuestas! Agregué jython.jar al classpath y se ejecuta correctamente:

java -cp "./;jython.jar" jythonEx 
+0

¿Cuál es la línea 12? pyEngine.eval ("");? – ilikeorangutans

+0

@ilikeorangutans: Sí, esa es la línea 12. – OscarRyz

+0

Correcto. Supongo que el ScriptEngineManager no puede encontrar el motor de Python, pero no veo lo que estoy haciendo mal que podría causar que ... – griffin

Respuesta

15

Primero tiene que registrar el motor.

Desde: ScriptEngineManager.getEngineByName:

[...] busca primero un ScriptEngineFactory que ha sido registrado como un mango [...] devuelve NULL si no se encontró fábrica

La guía del usuario dice to use it with JSR-223 usted tiene que:

a partir del 2 de Jython. 5.1 una implementación de JSR 223 se incluye en jython.jar. Simplemente agregue jython a su CLASSPATH y solicite el motor de script de python.

¿Lo hizo ya?

EDITAR Sobre su comentario: Creo que se debe abrir una nueva pregunta, se obtienen mejores respuestas.

+0

No, nunca lo hice, ¡gracias! He usado JavaScript a través de javax.script antes sin hacer nada, así que claramente me perdí ese paso. Déjame intentarlo ahora ... – griffin

+0

@griffin ¡Genial !, probablemente eso sea suficiente. Háganos saber si funciona, ¿verdad? – OscarRyz

+0

@Oscar: Gracias; ¡eso hizo el truco! – griffin

2

lo que probablemente tiene que registrar un for'python ScriptEngineFactory'