可能的重复:
subprocess.popen.stdout-再次实时阅读stdout!
我正在处理二进制文件中文件的ouptut,但我正在使用临时字符串来表示输出。由于从理论上讲,由于输出可能相当大,因此我希望使用Uncack或uncack_from处理输出作为流。
。代码是这样的:
file = '/home/t/FinancialData/GBPUSD/2007/05/01/20070501_01h_ticks.bi5';
command = ('lzma', '-kdc', '-S', 'bi5', file);
p = subprocess.Popen(command, stdout=subprocess.PIPE);
out, err = p.communicate();
for s in (out[x:x+20] for x in range(0, len(out), 20)):
values = struct.unpack(">3L2f", s)
with open(csvfilename, 'wb') as csvfile:
csvwriter = csv.writer(csvfile, delimiter=',',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
csvwriter.writerow(values);
有没有办法重写此功能,因此它不必将整个输出存储在输出中,而是将其作为流进行处理?
您可以在stdout
属性周围放一个select
调用 Popen
对象并进行轮询,直到过程完成。例如:
from subprocess import Popen, PIPE
from select import select
cmd = ('lzma', '-kdc', '-S', 'bi5', 'path/to/datafile')
p = Popen(cmd, stdout=PIPE)
while p.poll() == None:
r,w,e = select([p.stdout], [], [])
if r:
data = p.stdout.read(512)
# unpack and append to csv file ...
欢呼,
您可以从file
对象p.stdout
:
while True:
s = p.stdout.read(20)
if not s:
break
values = struct.unpack(">3L2f", s)
...
请注意,只有在Popen
对象上最多有一个管道时,此方法才安全。再多次,该过程可能会阻止等待输入或写入STDERR。在这种情况下,您应该使用 poll
, select
或螺纹将管道多重。