subprocess output line by line like file

0

Hej,

Zastanawiam się, czy jest sposób aby iterować linia po linii po outputcie z subprocess.run(command, **kwargs)
Chodzi mi o sposób typu tego, który można użyć z otwartym plikiem: for line in file:
Bez przelatywania przez cały plik, dzieląc go split'em według znaków nowej linii "\n"

Przykład:

#~ Pożądana iteracja powinna przypominać:
with open(file, option) as f:
  for line in f:
    pass
#~ Czyli:
output = subprocess.run(command, **kwargs)
for line in ouput:
   pass

#~ Zamiast:
output = subprocess.run(command, **kwargs)
for line in ouput.split("\n"):
   pass

Bo split mimo wszystko przeleci po całym outputcie żeby go podzielić, poza opcją napisania własnej metody, nie widzę innego sposobu, chyba że coś przeoczyłem w dokumentacji i jest jakiś odpowiednik .readline() dla stringów?

1

Nie widzę możliwości. z dokumentacji: stdout: Captured stdout from the child process. A bytes sequence, or a string[0]
Czyli łapie cały output jako jeden string. Takie coś można samym Unixem i strumieniami zrobić.
[0] https://docs.python.org/3.5/library/subprocess.html#subprocess.CompletedProcess

1
>>> from subprocess import PIPE, Popen

>>> with Popen('python3 -m this'.split(), stdout=PIPE, text=True) as proc:
...     for lineno, line in enumerate(proc.stdout, start=1):
...         print(lineno, line, end='')
1 The Zen of Python, by Tim Peters
2 
3 Beautiful is better than ugly.
4 Explicit is better than implicit.
5 Simple is better than complex.
...

>>> 

String możesz opakować w io.StringIO. Tutaj leci klasyczne find & slice:

>>> import io

>>> s = 'foo\nbar\nbaz\n'

>>> list(io.StringIO(s))
['foo\n', 'bar\n', 'baz\n']

>>> 

1 użytkowników online, w tym zalogowanych: 0, gości: 1