首页 > 解决方案 > 捕获子进程输出但不向控制台打印任何内容?

问题描述

我正在尝试使用子进程运行 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>

我不需要保存它,只需检查“已经存在”是否在其中。我拥有并且可以使用。

谢谢

注意:我最初想使用 subprocess.call 但我似乎无法捕获输出以检查响应中是否已存在

标签: pythonsubprocess

解决方案


您在控制台上看到的是标准错误,而不是标准输出。在正常模式下,curl 将获取的内容打印到 stdout 并将传输统计信息打印到 stderr。您可以使用-s/标志抑制统计信息,也可以通过传递给子进程调用来--silent丢弃 stderr 。stderr=subprocess.DEVNULL

如果您关心 stderr 输出,您还可以通过将其传递stderr=subprocess.PIPE或合并到 stdout 流中来单独捕获它(对于问题中的特定用例,显然不推荐)stderr=subprocess.STDOUT


推荐阅读