运行 来自 Java 进程的交互式 Python GUI (Matplotlib)

Running an interactive Python GUI (Matplotlib) from Java Process

我对此做了很多研究,不幸的是一直无法找到适合我目前遇到的问题的答案。

我的问题不像 "how do I run a python script from 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 window 打开,底线就是脚本 运行s。

现在,我正在旁边构建一个 Java 应用程序,并且有一个按钮,单击该按钮会创建一个 Java Process 对象,该对象将调用脚本。我通过阅读其他帖子知道无法从 java 运行 时间调用 PIPE,因此我创建了一个 .sh 文件来环绕此 python 脚本。

shell.sh:

#!/bin/sh
python /mypath/to/the/gui.py

Java调用shell脚本:

view.getLaunchGuiButton().addActionListener((e) -> {

            try {
                String[] prcArgs = new String[] { "/mypath/to/shell.sh" };
                Process proc = Runtime.getRuntime().exec(prcArgs);

            } catch (IOException e1 ) {
                e1.printStackTrace();
            }
        });

shell 脚本是正确的 - 当我从终端 运行 它正确时一切正常。

我知道 Java 确实在执行 shell 脚本,并调用 python 脚本。没有错误。我没有设置任何 BufferedReader 因为没有什么可读的 - 我只需要 GUI 来打开。我认为问题是一旦 shell 被执行, "terminal" 由 Runtime 打开的所谓的 Runtime 立即关闭,因此它杀死了 python 脚本和 GUI。

我的问题是,如何防止 Runtime 简单地 运行ning 并立即终止 python 脚本(也就是关闭终端)?

我已经完成的事情:

有什么想法吗?提前谢谢大家。

  1. 来自 Java 按钮监听器我执行了 xterm:

    try {
            Process p = Runtime.getRuntime().exec("xterm");
            Thread.sleep(1500);
    
        } catch (IOException e1 ) {
            e1.printStackTrace();
        }
    
  2. ~/.bashrc 中,我添加了使用 GUI 启动我的 Python 脚本的命令:

    if [[ -z "$XTERM_ONCE" ]]
    then
        export XTERM_ONCE=$(date)
        cd  /home/qswadey/path/to/py/script/
        python3 pyscript_with_GUI.py
    fi
    

    Python GUI 出现并继续...

运行 xterm 启动命令的想法,因为所有 xterm 都来自这个线程:

Thread.sleep 只是为了让 xterm 保持一段时间以查看短命令的输出,但是 xterm 仍然 运行 处于交互模式