Вывод данных из командной строки подпроцесса построчно - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь прочитать большой файл данных (= миллионы строк в очень специфическом формате), используя предварительно встроенную (в 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

(ENCODING установлен в config.py для iso-8859-1 - это шведский сайт)

У меня работает код, который дает мне данные, но впри этом он пытается удержать в памяти все это.У меня есть файлы большего размера, чтобы обработать их, что может привести к потере доступной памяти, так что это не вариант.

Я играл с bufsize на Popen, но не имел никакого успеха (а также, я не могу декодировать или разбивать после Popen, хотя я предполагаю, что факт, что мне нужно разделить прямо сейчас, на самом деле мойпроблема!).

1 Ответ

0 голосов
/ 03 апреля 2019

Я думаю, у меня это работает сейчас, поэтому я отвечу на свой вопрос, если кто-то еще будет искать это позже ...

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()
...