我可以覆盖io.BufferedReader中的默认read()方法吗?

时间:2016-12-01 21:30:27

标签: python python-3.x

我只需要将部分文件发送到另一个进程的STDIN中吗?

#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只从stdin中读取1000多个字节,然后遇到EOF。 我无法控制命令如何读取标准输入。

1 个答案:

答案 0 :(得分:3)

问题是,当传递一个句柄时,Popen尝试获取fileno,并使用真正的操作系统句柄,因此不可能轻易地用其他类似文件的对象来欺骗它。

但是你可以将Popen stdin设置为PIPE,在你选择的节奏中只写入正确的字节数,可能是小块,然后关闭< / p>

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使用PIPE,您必须使用stdout以避免死锁。