Моя цель: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.
Вопросы:
- Есть ли простой способ, как исправить код?
- Может ли кто-нибудь указать мне на какой-то пример, как я могу взаимодействовать с python, например. по пути клиент-сервер
- или любая другая идея?
BTW1: Jython не путь, так как мне нужно выполнить директивы CPython, которые не поддерживаются питона.
BTW2: Я знаю, что я могу выполнить сценарий питона в неинтерактивном способе, String [] = {команды "python.exe" "script.py"} ;. Проблема заключается в том, что инициализация занимает значительное время, это будет означать значительную проблему с производительностью.
Тем не менее, повторное изобретение колес звучит плохо.Какие заявления CPython вы имеете в виду, что Jython не сможет справиться? – GhostCat
Мне нужна библиотека numpy: import numpy as np привел к javax.script.ScriptException: ImportError: Нет модуля с именем numpy в