2016-07-02 11 views
1

私は別のプログラムをテストするためのプログラムを持っています。それはそうのようにpopenのを使用しています。Python3 Popen:毎回.encode()を使用する必要がありますか?

testProgram = subprocess.Popen(args, stdin = subprocess.PIPE, stdout = subprocess.PIPE) 

はpython2では、私はそうのようtestProgramに指示を送る:

のpython3で
testProgram.stdin.write("count "+vals[0]+"\n") 

は、書き込みではなく、STRのバイトのようなオブジェクトを望んでいます。私は、これはすべての書き込みのためにtestProgram.stdin.write(("count "+vals[0]+"\n").encode("utf-8"))のようなものを使用する必要があると思うが、私は明らかにそれを行うつもりはない。

Popenの標準入力をpython3のテキストストリームとして扱う簡単な方法はありますか、それともpython2に固執すべきですか?引数はuniversal_newlines = Truelooks like it should workですが、私の場合、プログラムはただちにresult = testProgram.stdout.readline()でフリーズします。

+0

プログラム、あなたは何を入力しているとは何ですか? –

+0

「イベントカウンター」です。私はそれが何を意味するのか本当に分かっていませんが、私はそれが何をすべきかを知っています。ファイルからAVLツリーを読み込み、さらに詳しい手順についてstdinをチェックすることになっています。スクリプトは数千命令を入力し、エントリが正しいこと、およびツリーのサイズが必要以上に大きくならないことを確認します。 – Kenkron

+0

'universal_newlines = True'は動作するはずですので、私が考えているのは、何らかのエンコーディングの問題があるかもしれないということだけです。https://docs.python.org/3.2/library/locale.html#locale.getpreferredencoding –

答えて

0

universal_newlines=Trueを使用すると正しい解決法ですが、python3では、Popenにbufsize=1を渡さない限り、入力は自動的に改行ごとにフラッシュされません。プログラムはのpython3で動作させるためには

、popenのラインになった:

testProgram = subprocess.Popen(args, stdin = subprocess.PIPE, stdout = subprocess.PIPE, universal_newlines = True, bufsize = 1) 
+0

'for line in testProgram.stdout'は同じようにするべきです –

+0

1' universal_newlines = True'で十分でない場合は、 'io.TextIOWrapper()'を使ってバイナリストリームをラップすることができます。 stdinバッファをフラッシュする( 'bufsize = 1'は古いPython 3バージョンで無視されるかもしれません)。一般に、stdin/stdoutパイプで同時に処理するようにスクリプトを構成する必要があります(スレッドまたはasync.ioを使用します)。そうでないと、stdinへの書き込みがstdoutからの読み込みと完全に同期していない限り壊れやすい) – jfs

+0

@JFsebastian古いバージョンでは動作しない 'bufsize = 1'について知っておくとよいでしょう。並行処理に関しては、なぜそれが必要なのかわかりません。私はstdinに何かを書いて、サブプロセスはそれを取得し、動作し、何かをstdoutに入れます。 stdoutを読んでいるのがブロックされているので、出力を与えるためにサブプロセスがどれくらい時間がかかるかは重要ではないようです。プログラムはそれを待つでしょう。 – Kenkron

関連する問題