8 апреля 2011 г.

Встраивание Python скриптов в Java приложение Часть 2

В прошлом посте было рассмотрено подключение интерпретатора Jyton к программе на Java и передачи ему команды в виде строкового выражения. Рассмотрим пример выполнения скрипта переданного интерпретатору из внешнего файла.
Допустим у нас имеется питоновский модуль находящийся в папке "Script":

  1. class ScriptDemo():  
  2.  def __init__(self,my):  
  3.   print "Script Demo init" + my  
  4.  def ret(self):  
  5.   return "esss"  
  6.  def retint(self, i):  
  7.   return i*2  
Доработаем немного предыдущий пример под работу с данным модулем.

  1. import java.io.FileNotFoundException;  
  2. import java.io.FileReader;  
  3.   
  4. import javax.script.ScriptEngine;  
  5. import javax.script.ScriptEngineManager;  
  6. import javax.script.ScriptException;  
  7.   
  8.   
  9. public class Start {  
  10.    
  11.  public static void main(String[] args) throws ScriptException, FileNotFoundException, NoSuchMethodException {  
  12.   
  13.  ScriptEngineManager factory = new ScriptEngineManager();   
  14.  ScriptEngine engine = factory.getEngineByName("jython");  
  15.  //считываем текстовый файл скрипта  
  16.         FileReader script = new FileReader("Script\\script.py");  
  17.         //передаем его интерпретатору   
  18.         engine.eval(script);  
  19.         //передаем в переменную а строковое значение  
  20.         //эту переменную можно будет использовать при вызове питоновских методов  
  21.         engine.put("a"," from java1");  
  22.         //создаем объект класса скрипта  
  23.         engine.eval("obj = ScriptDemo(a)");  
  24.         //присваиваем объекту an значение возвращенное питоновским методом ret   
  25.         //значение всегда возвращается типа Object   
  26.         Object an = engine.eval("obj.ret()");  
  27.         System.out.println(an.toString());  
  28.         int n=3;  
  29.         engine.put("b",n);  
  30.         Object bn = engine.eval("obj.retint(b)");  
  31.         System.out.print(  new Integer(bn.toString()));  
  32.  }  
  33.   
  34. }  
В результате выполнения программы получаем следующий вывод
Script Demo init from java1
esss
6