Как я могу прочитать вывод подпроцесса, не печатая его в оболочке родительского процесса? - PullRequest
0 голосов
/ 24 января 2019

Я хочу запустить API в моем скрипте Python, подождать, пока он не запустится правильно (он выведет «API ready»), а затем отправить ему несколько запросов.Вот что я попробовал:

api_cmd = "python3 api.py"

# Begin by starting API.
    api_process = subprocess.Popen(shlex.split(api_cmd), stdout=subprocess.PIPE)
    subprocess_pids.append(api_process.pid)

    # Wait until API has started
    print("Starting API...")
    while True:
        line = api_process.stdout.readline().decode('ascii')

        if "API ready" in line:
            print("API started! Wait 3 more seconds...")
            time.sleep(3)
            break
        else:
            print("Line: {}".format(line))

Это работает, если я установил PYTHONUNBUFFERED = 1 в качестве переменной окружения.Однако это имеет нежелательные последствия:

  1. Выводит выходные данные подпроцессов в оболочке, в которой я запускаю этот скрипт.
  2. Я не могу прочитать последнюю строку (которая говорит "API"готов "), но только предыдущий в качестве последней строки не имеет символа новой строки.

Может кто-нибудь сказать мне, как исправить это поведение?Я попробовал read () вместо readline (), но это как-то не сработало.

Вывод не из-за оператора print в цикле while, так как он не начинается с «Line:» итакже продолжается после завершения цикла while.Кроме того, вывод, прочитанный readline (), кажется, отличается от того, что напечатано в оболочке.

1 Ответ

0 голосов
/ 24 января 2019

Вывод на оболочку выводился в stderr. Я только передал вывод stdout. Исправлено добавлением stderr=subprocess.STDOUT:

api_process = subprocess.Popen(shlex.split(api_cmd), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...