Запуск интерактивного графического интерфейса Python (Matplotlib) из процесса Java
Я провел довольно много исследований по этому вопросу и, к сожалению, не смог найти ответ, который подходил бы к проблеме, с которой я в настоящее время сталкиваюсь.
Мой вопрос не так прост, как "как запустить скрипт python из Java", на который существует по крайней мере 10 потоков, содержащих один и тот же ответ. Я понимаю, как это сделать. Моя проблема заключается в следующем:
У меня есть файл .py (gui.py), который выглядит примерно так:
#!/usr/bin/env python
import matplotlib.pyplot as plt
import copy
import math
import numpy as np
class GUI(object):
...
...
...
if __name__ == '__main__':
GUI.run()
Этот графический интерфейс является интерактивным matplotlib сюжет, на котором пользователи рисуют материал. Детали не важны-суть в том, что сценарий выполняется до тех пор, пока открыто окно matplotlib.
Теперь я создаю приложение Java на стороне, и есть кнопка, которая при нажатии создает объект Java Process, который вызовет скрипт. Я знаю из чтения других сообщений, что PIPE не может быть вызван из среды выполнения java, поэтому я создал файл .sh, который обертывает этот скрипт python.
shell.sh:
#!/bin/sh
python /mypath/to/the/gui.py
Ява чтобы вызвать скрипт оболочки:
view.getLaunchGuiButton().addActionListener((e) -> {
try {
String[] prcArgs = new String[] { "/mypath/to/shell.sh" };
Process proc = Runtime.getRuntime().exec(prcArgs);
} catch (IOException e1 ) {
e1.printStackTrace();
}
});
Скрипт оболочки корректен - когда я правильно запускаю его с терминала, все работает нормально.
Я знаю, что Java действительно выполняет сценарий оболочки и вызывает скрипт python. Здесь нет никаких ошибок. Я не настраивал никаких BufferedReader, потому что там нечего читать - мне просто нужно открыть GUI. Я считаю, что проблема заключается в том, что как только оболочка выполнена, "терминал", так сказать, который открывается Runtime, немедленно открывается. закрыт, следовательно, он убивает скрипт python и, следовательно, графический интерфейс.
Мой вопрос заключается в том, как мне удержать Runtime от простого запуска и немедленного уничтожения скрипта python (он же закрытие терминала)?
То, что я уже сделал:
chmod +x ../../shell.sh- попробовал использовать
nohup /call/python/here &в скрипте оболочки. Ничего не вышло. - попробовал использовать Java
ProcessBuilderвместоRuntime. Никакая разница.
Есть идеи? Заранее всем спасибо.
1 ответ:
Из Java Button listner I exec-ed xterm:
try { Process p = Runtime.getRuntime().exec("xterm"); Thread.sleep(1500); } catch (IOException e1 ) { e1.printStackTrace(); }В
~/.bashrcя добавил свою команду, которая запускает мой скрипт Python с GUI:if [[ -z "$XTERM_ONCE" ]] then export XTERM_ONCE=$(date) cd /home/qswadey/path/to/py/script/ python3 pyscript_with_GUI.py fiГрафический интерфейс Python появляется и продолжается...
Идея запуска команды при запуске xterm, для всех xterm берется из этого потока: Как запустить команду при запуске xterm?
Thread.sleepпросто для удержания xterm в течение некоторого времени, чтобы увидеть выход short команда, однако xterm продолжает работать в интерактивном режиме
Comments