从子流程命令行逐行输出数据

时间:2019-04-02 14:15:16

标签: python-3.x subprocess buffering

我正在尝试使用预构建(以C语言编写)例程读取大型数据文件(=数百万行,以非常特定的格式)。然后,我想通过生成器函数逐行添加结果。

我可以读取文件,但是可以正常运行:

<input autocomplete="off">

直接在Linux中

会在找到结果时逐行打印结果,我没有运气尝试在生成器函数中复制此结果。似乎将整个批次输出为单个字符串,我需要在换行符上进行分割,当然,在生成第1行之前,所有内容都需要阅读。

此代码将读取文件,没问题:

<command> <filename>

(在config.py中将ENCODING设置为iso-8859-1-这是瑞典语站点)

我拥有的代码可以正常工作,因为它为我提供了数据,但是这样做却试图将全部存储在内存中。我要处理的文件大于此文件,可能会耗尽可用内存,因此这不是一个选择。

我在Popen上玩过bufsize,但没有成功(而且,在Popen之后我无法解码或分割,尽管我想我现在需要分割的事实实际上是我的问题!)

1 个答案:

答案 0 :(得分:0)

我想我现在正在处理这个问题,所以如果其他人稍后再寻找它,我会回答我自己的问题...

proc = subprocess.Popen(shlex.split(file_cmd), stdout=subprocess.PIPE)
while True:
    output = proc.stdout.readline()

    if output == b'' and proc.poll() is not None:
        break
    if output:
        yield output.decode(config.ENCODING).strip()