如何将Popen的Ouput作为struct.unpack作为流



可能的重复:
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。在这种情况下,您应该使用 pollselect或螺纹将管道多重。

相关内容

  • 没有找到相关文章