Предотвратить блокировку подпроцесса PIPE - PullRequest
0 голосов
/ 09 февраля 2019

Я хочу использовать подпроцесс Popen для вызова strace в Linux.Я также хочу перехватить каждую строку выходных строк, если это возможно, в реальном времени.

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

from threading import Thread
from queue import Queue, Empty

pid = 1

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

p = Popen(["strace", "-p", pid], stdout=subprocess.PIPE, bufsize=1)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # thread dies with the program
t.start()

try:
    line = q.get_nowait()
    print("Got it! "+line)
except Empty:
    pass

1 Ответ

0 голосов
/ 10 февраля 2019

Вот краткий рабочий пример:

Обратите внимание:

  • strace записывает в stderr (если не указано -o filename)
  • все аргументы должны быть строками (или байтами), то есть pid должен быть задан как "1"
  • буферизация строки работает только с универсальными символами новой строки
  • вы должны быть пользователем root для отслеживания процесса 1

import subprocess

PID = 1 

p = subprocess.Popen(
    ["strace", "-p", str(PID)],
    stdin=subprocess.DEVNULL, stderr=subprocess.PIPE,
    universal_newlines=True, bufsize=1)
for line in p.stderr:
    line = line.rstrip()
    print(line)
...