【问题标题】:Running an interactive Python GUI (Matplotlib) from Java Process从 Java 进程运行交互式 Python GUI (Matplotlib)
【发布时间】:2017-06-30 13:36:03
【问题描述】:

我对此进行了相当多的研究,但遗憾的是无法找到适合我目前遇到的问题的答案。

我的问题并不像“如何从 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 Process 对象,该对象将调用该脚本。我从其他帖子中了解到,无法从 java 运行时调用 PIPE,因此我创建了一个 .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,Runtime 打开的所谓“终端”会立即关闭,因此它会杀死 python 脚本,从而杀死 GUI。

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

我已经做过的事情:

  • chmod +x ../../shell.sh
  • 尝试在 shell 脚本中使用 nohup /call/python/here &。没用。
  • 尝试使用 Java 的 ProcessBuilder 而不是 Runtime。没有区别。

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

【问题讨论】:

    标签: java python matplotlib processbuilder runtime.exec


    【解决方案1】:
    1. 从我执行 xterm 的 Java 按钮侦听器:

      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 都来自这个线程:How to run a command on the startup of an xterm?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-30
      • 2015-06-20
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      相关资源
      最近更新 更多