Запуск интерактивного графического интерфейса 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. Никакая разница.


Есть идеи? Заранее всем спасибо.

607   1  

1 ответ:

  1. Из Java Button listner I exec-ed xterm:

    try {
            Process p = Runtime.getRuntime().exec("xterm");
            Thread.sleep(1500);
    
        } catch (IOException e1 ) {
            e1.printStackTrace();
        }
    
  2. В ~/.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

    Ничего не найдено.