我在JavaFX中使用FXML构建了一个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启动一个我听说不太优雅的外部程序。
然后我尝试通过在Java中执行python some_script.py
命令,使用BufferedReader
捕获进程输出来解决这个问题,在AnchorPane中创建一个只有TextArea的新JavaFX场景,成为伪造的Java -console,然后在TextArea上调用.setText()
以将脚本输出放入其中。
这种方法很有效,但我遇到了很多问题,因为写入JavaFX控制台会跳入几十行的大块行,而不是像Python代码那样逐行写入Print()
调用。此外,我有一些NullPointerException
和ArrayIndexOutOfBoundsException
有点随机,因为Java会正确地写几百行然后抛出这些错误并冻结程序。我很确定这两个问题都是由于在如此高的数据速率下有如此多的数据而溢出BufferedReader
缓冲区和/或TextArea.setText()
缓存或类似的东西。
我想知道的是我应该采取什么方法。我无法将Python代码迁移到Java,因为它依赖于其他人的Python库来收集其数据。我是否应该尝试使用伪Java控制台的想法,看看我能否做到这一点?我应该返回从Java打开命令提示符窗口并运行Python脚本,然后添加支持在Mac和Linux中对终端执行相同的操作吗?有没有更好的方法我没想过?是不是让Java代码调用Python代码并处理其输出只是恶心和想法?
如果您想查看任何代码(有很多代码)或者我可以澄清任何内容,请告诉我,我会尽力快速回复。谢谢!
答案 0 :(得分:0)
我的解决方案仍然是从Java Processbuilder调用Python代码,但使用像-u
这样的python -u scriptname.py
选项来指定无缓冲的Python输出。