我用 FXML 在 JavaFX 中构建了一个 GUI,用于运行一堆不同的 Python 脚本。Python 脚本不断从设备收集数据并将其打印到控制台,因为它以大约 10 到 70 Hz 的频率循环收集,具体取决于正在运行的脚本,并且它们不会自行停止。
我希望最终用户能够单击我的 GUI 上的按钮来启动脚本并让他们看到输出。目前,使用我已经做了最好是Runtime.exec()
用命令"cmd /c start cmd /k python some_script.py"
这将打开Windows命令提示符,运行python some_script.py
它,并保持命令提示符打开,以便您可以看到输出。问题在于它只适用于 Windows(我的操作系统),但我需要有通用的操作系统支持,并且它依赖于 Java 启动一个我听说不是很优雅的外部程序。
然后我尝试通过python some_script.py
在 Java 中执行命令来解决这个问题,使用 捕获进程输出BufferedReader
,在 AnchorPane 中创建一个只有 TextArea 的新 JavaFX 场景作为伪 Java 控制台,然后调用.setText()
该 TextArea 来放置脚本输出在里面。
这有点奏效,但我遇到了很多问题,因为写入 JavaFX 控制台会跳成几十行的大块,而不是在 Python 代码Print()
调用时逐行写入。另外,我得到了一堆NullPointerException
而且ArrayIndexOutOfBoundsException
有点随机,因为 Java 会正确编写几百行,但随后抛出这些错误并冻结程序。我很确定这两个问题都是由于在如此高的数据速率下有如此多的数据溢出BufferedReader
缓冲区和/或TextArea.setText()
缓存或类似的东西。
我想知道的是我应该采取什么方法。我无法将 Python 代码迁移到 Java,因为它依赖于其他人的 Python 库来收集其数据。我应该尝试保持伪 Java 控制台的想法,看看我是否可以做到这一点?我应该回到从 Java 打开命令提示符窗口并运行 Python 脚本,然后添加对在 Mac 和 Linux 中使用终端执行相同操作的支持吗?有没有我没有想到的更好的方法?让 Java 代码调用 Python 代码并处理其输出的想法是否令人厌恶和可怕?
如果您想查看任何代码(有很多)或者我是否可以澄清任何内容,请告诉我,我会尽力快速回复。谢谢!
我的解决方案是仍然从 Java Processbuilder 调用 Python 代码,但使用-u
像python -u scriptname.py
指定无缓冲 Python 输出这样的选项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句