3

Win32 OS で Python 2.7 を実行していますが、プラットフォームに依存しないコードを書きたいと思っています。私が書いた Java プログラムとリアルタイムで対話するために Python を使用しようとしていますが、これを行うにはパイプを使用するのが最善の方法です。私の Python スクリプトは Java をサブプロセスとして呼び出しています。基本的に、Java は GUI であり、Python はバックエンドです。(Jython や wxPython は使いたくありません。それぞれの言語が提供する標準ライブラリに依存したいだけだからです。) 2 つの間の通信を設定しようとすると、ひどいものでした。を使用して、(親) Python スクリプトから (子) Java クラスにメッセージを送信できます。

process.stdin.write(msg)
process.stdin.flush()

しかし、Java の出力を読み取ることはできませんでした。私が使う

process.stdout.read()

しかし、読むものが何もない場合、明らかにこれは永久にブロックされます。process.communicate()サブプロセスが終了するまで何もしないため、立ち入り禁止です。私の調査によると、この問題を回避するために人々が使用する一般的な方法は「スレッドを使用する」ことです (ただし、誰かが書き込み時に改行を追加することを提案しましたが、うまくいきませんでした)。それがどのように見えるか考えてください。標準ライブラリのsubprocess.pyソースを調べてみましたが、役に立ちませんでした。少なくとも stdout が空かどうかを確認する方法はありますか? そうでない場合、どうすればこれを達成できますか?

4

1 に答える 1

2

process.stdout.read()
ですが、読み取るものがない場合、これは明らかに永久にブロックされます。

正確ではありませんが、基本的には、読み取り/ヒットするまで待機している間EOF、ファイルが閉じたときに設定されます。これを回避する1つの方法は、読み取りたいバイト数を process.stdout.read(1)指定することで、1バイトを読み取り、ない場合は戻ります。バイト次に、少なくとも1バイトまたはが存在するまで待機しますEOF

selectオプションのタイムアウト期間を持つpythonモジュールを使用することもできます。この場合、selectはこれだけ長く待機するか、Windowsでは完全にはサポートされていない可能性がありますが単に空の値http://docs.python.org/library/select.htmlで戻ります。

(誰かが書くときに改行を追加することを提案しましたが-うまくいきませんでした)

私は実際にこれをPythonから/へと行っており、データは一連の行ですが、それらを削除する必要があります。両方のプロセスがデータを登録するためにフラッシュする必要がある場合があることにprocess.stdout.readline().rstrip()注意してください。

私はこのJavaを見つけました:パイプ(stdin / stdout)を介したプロセスの読み取りと書き込みの両方の方法。これはあなたを助けるかもしれません。

幸運を。

于 2012-07-07T02:35:08.623 に答える