2016-12-01 5 views
2

ファイルの一部のみを別のプロセスのSTDINに送る必要がありますか?io.BufferedReaderのデフォルトのread()メソッドをオーバーライドできますか?

#Python 3.5 
from subprocess import PIPE, Popen, STDOUT 

fh = io.open("test0.dat", "rb") 
fh.seek(10000) 
p = Popen(command, stdin=fh, stdout=PIPE, stderr=STDOUT) 
p.wait() 

どのように私はcommandが唯一の標準入力から1000の以上のバイトを読み、EOFに遭遇することを確認してください。 私はコマンドが標準入力をどのように読み込むかを制御できません。

+0

私の答えは間違っていました。 'Popen'は実際のOSハンドルを使用しているので、このようにするのは不可能です。 –

答えて

3

問題は、ハンドルを渡すと、Popenはfilenoを取得しようとし、実際のOSハンドルを使用するため、他のファイルライクなオブジェクトで簡単に欺くことはできません。

しかし、あなたは、PIPEとしてPopenstdinを設定し、選択したリズムで、おそらく小さな塊で、それまでのバイトのみ正しい番号を書き、その後

それを閉じることができ
import io 
from subprocess import PIPE, Popen, STDOUT 

fh = io.open("test0.dat", "rb") 
fh.seek(10000) 


p = Popen(command, stdin=PIPE, stdout=PIPE, stderr=STDOUT) 
p.stdin.write(fh.read(1000)) 
# do something & write again 
p.stdin.write(fh.read(1000)) 
# now it's enough: close the input 
p.stdin.close() 

p.wait() 

は、しかし注意してください:ので、 stdinstdoutを使用すると、デッドロックを回避するにはstdoutを消費する必要があります。

+0

私の答えを編集しました。小さな塊で読むことができます。大きなファイルとの違いは、いつパイプを閉じるかを決めることができることです。 –

+0

素晴らしい、ありがとう! Popenがfileno()の後にどのメソッドを呼び出すのか知っていますか?私はオーバーライドを考え出しましたが、read/readline/readlinesのようなものは呼び出されないようです。 – olekb

+0

私は、ファイルディスクリプタを保持した後、 'os.read()'を使用して終了すると思います:extract: 'data = os.read(fd、4096)'(モジュールがひどく複雑です)。私は解決策を掘ってうれしいです。私はこのために長い間前に開発した低レベルのモジュールをいくつかオープンしなければなりませんでした(私の必要性はプロセスに継続的に "はい"を渡すことでした) –

関連する問題