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

mic*_*ich 3 subprocess buffering python-3.x

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

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

<command> <filename>

直接在linux中将在找到结果时逐行打印结果,我没有运气尝试在我的生成器函数中复制它。它似乎将整个批次输出为一个字符串,我需要在换行符上拆分它,当然,然后在我可以生成第 1 行之前,所有内容都需要阅读。

这段代码将读取文件,没有问题:

import subprocess
import config

file_cmd = '<command> <filename>'

for rec in (subprocess.check_output([file_cmd], shell=True).decode(config.ENCODING).split('\n')):
    yield rec

Run Code Online (Sandbox Code Playgroud)

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

我的代码有效,因为它为我提供了数据,但在这样做时,它试图将全部数据保存在内存中。我有比这个更大的文件要处理,这可能会耗尽可用内存,所以这不是一个选择。

我已经在 Popen 上使用了 bufsize,但没有取得任何成功(而且,我无法在 Popen 之后解码或拆分,尽管我想我现在需要拆分的事实实际上是我的问题!)。

mic*_*ich 5

我想我现在已经可以使用这个了,所以如果其他人稍后正在寻找这个,我会回答我自己的问题......

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()
Run Code Online (Sandbox Code Playgroud)