【问题标题】:How to suppress stdout & stderr until success in python? [duplicate]如何抑制标准输出和标准错误,直到在 python 中成功? [复制]
【发布时间】:2020-11-12 05:58:57
【问题描述】:

我想重复代码块直到成功输出,但只想显示成功的消息。

while i < 6:
    try:
      sys.tracebacklimit = 0       #this line seems not work
      gluster_volume_names = []
      gstatus_output = subprocess.check_output('gstatus -a -o json ', shell=True).decode()
      date, time, json_part = gstatus_output.split(maxsplit=2)
      gluster_info = json.loads(json_part)
      volume_list = gluster_info["volume_summary"]
      ....
      ....
      break
    except:
      i += 1
      continue

但我不知道如何在下面抑制这些输出。 (跑不成功)他们不是我想要的结果。该代码块在尝试不到 5 次后最终成功运行然后退出。

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/gstatus-0.66-py3.6.egg/EGG-INFO/scripts/gstatus", line 143, in main
  File "/usr/local/lib/python3.6/site-packages/gstatus-0.66-py3.6.egg/gstatus/libgluster/cluster.py", line 543, in update_state
gstatus.libutils.excepts.GlusterFailedVolume: Unable to query volume 'BLAH'
Possible cause: cluster is currently reconverging after a nodehas entered a disconnected state.
Response: Rerun gstatus or issue a peer status command to confirm

请帮忙!

【问题讨论】:

  • 这个脚本是由另一个应用程序用硬编码行启动的。我不能使用 2>/dev/null。叹息...但是感谢@Cowboy_Patrick 的快速响应

标签: python python-3.x


【解决方案1】:

您应该使用标准的subprocess.run 方法并将标准错误通过管道传送到/dev/null,而不是使用subprocess.check_output。请改用以下内容:

gstatus_output = subprocess.run('gstatus -a -o json ', shell=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout.decode()

【讨论】:

  • 太棒了!用'gstatus -a -o json && sleep 2'在我的代码中测试并按预期运行。非常感谢 pip1726
【解决方案2】:

如果您只是想在 linux 系统上抑制控制台中的错误,您可以尝试:

python yourCode.py 2&gt;/dev/null

这样你也可以抑制标准输出:

python yourCode.py 1&gt;/dev/null

【讨论】:

    【解决方案3】:

    一种可能性是将标准输出和标准错误重定向到一个字符串。执行后,可以选择是打印字符串的结果,还是丢弃重试。

    from contextlib import redirect_stdout, redirect_stderr
    import io
    
    f = io.StringIO()
    with redirect_stdout(f):
        with redirect_stderr(f):
            .... whatever you want ....
    s = f.getvalue()
    

    【讨论】:

    • 来自redirect_stdout 的文档:“它对子进程的输出也没有影响。”
    • 哦。对不起。我错过了。
    猜你喜欢
    • 2012-08-11
    • 2011-03-09
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多