захватить вывод подпроцесса, но ничего не выводить на консоль? - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь запустить команду curl, используя подпроцесс. Работает отлично. У меня есть выход, который мне нужен в переменной. Единственное, чего я хочу, это когда процесс запускается, мне не нужна эта печать в консоли:

          % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                         Dload  Upload   Total   Spent    Left  Speed
        100   255  100   153  100   102     56     37  0:00:02  0:00:02 --:--:--    56

Вот как выглядит эта часть скрипта:

        import subprocess

        def F_createSingleTable(table_name):
         un = "test"
         pw = "testpass"
         url = "https://blah.fake.url.com:7877/services/createstable"
         size = "10"
         size_til_archive = "30"
         retention = "5"
         curl_call =\
          [\
          'curl', \
          '-k', \
          '-u', \
          (un)+":"+(pw), \
          (url), \
          '-d', \
          'name='+(table_name), \
          '-d', \
          'size='+(size), \
          '-d', \
          'size_til_archive='+(size_til_archive), \
          '-d', \
          'retention='+(retention)\
          ]
         process = subprocess.run((curl_call), check=True, stdout=subprocess.PIPE, universal_newlines=True)
         output = process.stdout
         if "already exists" in (output):
          print("table: "+(table_name)+" already exists")

, если это имеет значение, фактический ответ, который я получаю, который хранится в выходных данных:

        <?xml version="1.0" encoding="UTF-8"?>
        <response>
          <messages>
            <msg type="ERROR">table_name table already exists</msg>
          </messages>
        </response>

Мне не нужно его сохранять, просто проверьте, есть ли в нем «alredy». Что у меня есть и работает.

Спасибо

ПРИМЕЧАНИЕ. Первоначально я хотел использовать subprocess.call, но мне не удалось захватить вывод, чтобы проверить, существует ли уже ответ в ответе

1 Ответ

0 голосов
/ 11 января 2020

То, что вы видите на консоли, находится на stderr, а не на stdout. В обычном режиме curl печатает извлеченный контент в stdout и передает статистику в stderr. Вы можете либо подавить статистику с помощью флага -s / --silent, либо сбросить stderr, передав stderr=subprocess.DEVNULL вашему вызову подпроцесса.

Если вам важен вывод stderr, вы также можете захватить его отдельно с помощью передать stderr=subprocess.PIPE или объединить его с потоком stdout (очевидно, не рекомендуется для указанного c варианта использования в вопросе), передав stderr=subprocess.STDOUT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...