从Java进程运行交互式Python GUI(Matplotlib)

从Java进程运行交互式Python GUI(Matplotlib),java,python,matplotlib,processbuilder,runtime.exec,Java,Python,Matplotlib,Processbuilder,Runtime.exec,我在这方面做了很多研究,不幸的是,我无法找到一个适合我目前所面临问题的答案 我的问题不像“如何从Java运行python脚本”那么简单,至少有10个线程都包含相同的答案。我知道怎么做。我的问题如下: 我有一个.py文件(gui.py),看起来像这样: #!/usr/bin/env python import matplotlib.pyplot as plt import copy import math import numpy as np class GUI(object): ...

我在这方面做了很多研究,不幸的是,我无法找到一个适合我目前所面临问题的答案

我的问题不像“如何从Java运行python脚本”那么简单,至少有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()
这个gui是一个交互式matplotlib绘图,用户可以在上面绘制东西。细节并不重要-底线是只要matplotlib窗口打开,脚本就会一直运行

现在,我正在构建一个Java应用程序,旁边有一个按钮,当单击该按钮时,会创建一个Java
进程
对象,该对象将调用脚本。通过阅读其他文章,我知道无法从java运行时调用管道,因此我创建了一个
.sh
文件,该文件围绕这个python脚本进行包装

shell.sh

#!/bin/sh
python /mypath/to/the/gui.py
调用shell脚本的Java脚本:

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被执行,由
运行时打开的所谓“终端”会立即关闭,因此它会杀死python脚本和GUI

我的问题是,如何避免运行时仅仅运行并立即终止python脚本(即关闭终端)

我已经做过的事情:

  • chmod+x.././shell.sh
  • 尝试在shell脚本中使用
    nohup/call/python/here&
    。没用
  • 尝试使用Java的
    ProcessBuilder
    而不是
    运行时
    。没有区别
有什么想法吗?提前谢谢大家

  • 从Java按钮列表器I exec ed xterm:

    try {
            Process p = Runtime.getRuntime().exec("xterm");
            Thread.sleep(1500);
    
        } catch (IOException e1 ) {
            e1.printStackTrace();
        }
    
  • ~/.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一段时间以查看short命令的输出,但是xterm仍在交互模式下运行