运行 来自 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 脚本(也就是关闭终端)?
我已经完成的事情:
chmod +x ../../shell.sh
- 尝试在 shell 脚本中使用
nohup /call/python/here &
。没用。
- 尝试使用 Java 的
ProcessBuilder
而不是 Runtime
。没有区别。
有什么想法吗?提前谢谢大家。
来自 Java 按钮监听器我执行了 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 保持一段时间以查看短命令的输出,但是 xterm 仍然 运行 处于交互模式
我对此做了很多研究,不幸的是一直无法找到适合我目前遇到的问题的答案。
我的问题不像 "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 脚本(也就是关闭终端)?
我已经完成的事情:
chmod +x ../../shell.sh
- 尝试在 shell 脚本中使用
nohup /call/python/here &
。没用。 - 尝试使用 Java 的
ProcessBuilder
而不是Runtime
。没有区别。
有什么想法吗?提前谢谢大家。
来自 Java 按钮监听器我执行了 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 保持一段时间以查看短命令的输出,但是 xterm 仍然 运行 处于交互模式