2017-08-24 12 views
0

私は、さまざまなPythonスクリプトを実行するためにFXMLを使用してJavaFXでGUIを構築しました。 Pythonスクリプトは、実行中のスクリプトに応じて、デバイスからデータを連続的に収集し、コンソールに出力します。実行中のスクリプトに応じて、約10〜70 Hzのループで収集されます。JavaFX show looping Pythonプリント出力

スクリプトを起動し、出力を見ることができるGUI上のボタンをエンド・ユーザーがクリックできるようにしたい。現在、私が行ったベストは、のコマンドで"cmd /c start cmd /k python some_script.py"を使用し、Windowsコマンドプロンプトを開き、python some_script.pyを実行し、出力を見ることができるようにコマンドプロンプトを開いたままにしています。これは、Windows(私のOS)上でのみ動作しますが、普遍的なOSをサポートする必要があり、Javaが外部のプログラムを起動することに依存しているということは、それほどエレガントではありません。

私はその後、Javaでpython some_script.pyコマンドを実行BufferedReaderとプロセスの出力をキャプチャし、疑似JavaベースのコンソールであることをAnchorPane中だけのTextAreaで新しいJavaFXのシーンを作成し、その後.setText()を呼び出すことによってこの問題を解決しようとしましたそのTextAreaにスクリプト出力を挿入します。

これはうまくいきましたが、PythonコードでPrint()を呼び出しているときに、JavaFXコンソールへの書き込みが1行ずつ書き込むのではなく、数十行の大きなチャンクにジャンプするという多くの問題が発生しました。また、私はNullPointerExceptionArrayIndexOutOfBoundsExceptionという束を幾分ランダムに取得していますが、Javaは数百行も正確に書いていますが、それらのエラーを投げてプログラムをフリーズします。私は、これらの問題の両方が、BufferedReaderバッファおよび/またはTextArea.setText()キャッシュまたは類似のものをオーバーフローしたそのような高いデータレートで非常に多くのデータを持つことによると確信しています。

私が知りたいことは、私がこれで取るべきアプローチです。 PythonコードをJavaに移行することはできません。他の誰かのPythonライブラリに依存してデータを収集するからです。疑似Javaコンソールのアイデアを守り、それを実現できるかどうかを確認する必要がありますか?私は、Javaからコマンドプロンプトウィンドウを開き、Pythonスクリプトを実行して、MacとLinuxのターミナルで同じことをするためのサポートを追加する必要がありますか?私が考えなかったより良いアプローチはありますか? JavaコードでPythonコードを呼び出し、その出力を処理するのはちょっと気分が悪く、恐ろしいアイデアですか?

コードを表示したい場合(非常にたくさんあります)、または何かを明確にすることができるかどうか教えてください。すぐに対応するように最善を尽くします。ありがとうございました!

答えて

0

私の解決策は、依然としてJava ProcessbuilderのPythonコードを呼び出すことでしたが、python -u scriptname.pyのような-uオプションを使用して、バッファされていないPython出力を指定しました。

関連する問題