捕获子进程输出,但不打印任何内容到控制台?

问题描述 投票:-1回答:2

我正在尝试使用子进程运行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,但似乎无法捕获输出以检查响应中是否已存在

python subprocess
2个回答
0
投票

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

如果您关心stderr输出,也可以通过传递stderr=subprocess.PIPE来分别捕获它,或者通过传递stderr=subprocess.STDOUT将其合并到stdout流中(显然,对于该问题的特定用例不建议这样做)。


0
投票

capture_output方法的subprocess.run参数默认情况下为False,如果要使其将输出捕获到True属性中,则必须将其设置为stdout

process = subprocess.run(curl_call, capture_output=True, check=True, universal_newlines=True)
© www.soinside.com 2019 - 2024. All rights reserved.