0

Scanner を使用して stdin から入力を取得する Java プログラムをテストするための Python プログラムを作成しようとしています。

他のすべての投稿は popen との通信を使用することを示していますが、私にとってはまったく機能しません。Python プログラムを実行すると、popen が呼び出され、Java プログラムが入力を待機している間に停止します。popen の後に print ステートメントを書いて確認しました。決して印刷されません。

とてもシンプルです。入力を待つこのプログラムに入力を与えたいだけです。

コードは次のとおりです。

import os.path, subprocess
from subprocess import PIPE

p = subprocess.Popen(['java', 'Main'], stdin=PIPE, stdout=PIPE)
print 'after subprocess' #this never get's printed
output = p.communicate(input='5 5 4 3 2 1'.encode())[0]
print output
4

1 に答える 1

0

詳細な情報 (Java コードのサンプルなど) がなければ、断言することはできませんが、問題は Java コードが完全な行を待っているのに、あなたがそれを送信していないことだと思います。

もしそうなら、修正は簡単です:

output = p.communicate(input='5 5 4 3 2 1\n'.encode())[0]

補足として、なぜencodeその文字列を呼び出しているのですか? ソースコードが使用する文字セットで既にエンコードされています。したがって、 を呼び出すときencodeは、まずそれを Unicode にデコードする必要があります。そして、 に引数を渡さなかったのでencode、それをデフォルトの文字セット ( ) にエンコードしようとしますsys.getdefaultencoding()が、これは Java コードが期待しているものと、すでに持っているものより一致する可能性が低いようです。encode引数を指定して呼び出す価値はほとんどありませstrunicode

* ご参考までに、例外は、 や などの特殊なコーデックをいくつか使用している場合hexですgzip。Python 3 では、これらの特殊なケースの時折の有用性は、encode既にエンコードされた文字列を呼び出すという頻繁なバグ磁石ほどではないと判断したため、言語から削除しました。

于 2015-05-02T03:23:10.520 に答える