2016-09-12 3 views
0

Моя цель:JAVA взаимодействие с CPython

Когда я бегу на Python (CPython) из командной строки (не Jython, так как он не поддерживает некоторые пакеты, как NumPy) я могу интерактивно написать строки кода и посмотреть результаты его выход.

Моя цель - сделать это программно в JAVA. Вот моя попытка сделать так:

Код:

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 

public class PythonProcess { 
    private Process proc; 
    private BufferedReader stdInput; 
    private BufferedReader stdError; 
    private BufferedWriter stdOutput; 

    public PythonProcess() { 
     Runtime rt = Runtime.getRuntime(); 
     String[] commands = { "python.exe" }; 
     try { 
      proc = rt.exec(commands); 
      stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
      stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 
      stdOutput = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private String executeCommand(String command) throws IOException { 
     stdOutput.write(command + "\n"); 
     stdOutput.newLine(); 
     String s = null; 
     StringBuffer str = new StringBuffer(); 
     while ((s = stdInput.readLine()) != null) { 
      str.append(s); 
     } 
     return str.toString(); 
    } 

    public void initialize() throws IOException { 
     // will create a file - if correctly executed in python 
     stdOutput.write("f = open('c:/downloads/deleteme.txt','w')"); 
     stdOutput.newLine(); 
     stdOutput.write("f.write('hi there, I am Python \n')"); 
     stdOutput.newLine(); 
     stdOutput.write("f.close()"); 
     stdOutput.newLine(); 
     stdOutput.flush(); 
    } 

    public static void main(String[] args) throws IOException { 
     PythonProcess proc = new PythonProcess(); 
     proc.initialize(); // time demanding initialization 
     for (int i = 0; i < 10; i++) { 
      String out = proc.executeCommand("print \"Hello from command line #"+i+"\""); 
      System.out.println("Output: " + out); 
     } 
    } 
} 

Проблема:

Кажется, что код принят stdOutput в Initialize() метод не выполняется Python вообще, поскольку файл c: /downloads/deleteme.txt не был создан. Позже я также не могу прочитать какой-либо вывод из stdInput при вызове метода executeCommand.

Вопросы:

  1. Есть ли простой способ, как исправить код?
  2. Может ли кто-нибудь указать мне на какой-то пример, как я могу взаимодействовать с python, например. по пути клиент-сервер
  3. или любая другая идея?

BTW1: Jython не путь, так как мне нужно выполнить директивы CPython, которые не поддерживаются питона.


BTW2: Я знаю, что я могу выполнить сценарий питона в неинтерактивном способе, String [] = {команды "python.exe" "script.py"} ;. Проблема заключается в том, что инициализация занимает значительное время, это будет означать значительную проблему с производительностью.

+0

Тем не менее, повторное изобретение колес звучит плохо.Какие заявления CPython вы имеете в виду, что Jython не сможет справиться? – GhostCat

+0

Мне нужна библиотека numpy: import numpy as np привел к javax.script.ScriptException: ImportError: Нет модуля с именем numpy в

Смежные вопросы