Как подавить stdout и stderr до успеха в python? [дубликат]

Nov 12 2020

Я хочу повторять блок кодов до успешного вывода, но хочу отображать только успешные сообщения.

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

Пожалуйста помоги!

Ответы

pip1726 Nov 12 2020 at 13:15

Вместо использования subprocess.check_outputвы должны использовать стандартный subprocess.runметод и передать стандартную ошибку в / dev / null. Вместо этого используйте следующее:

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

Cowboy_Patrick Nov 12 2020 at 13:04

Если вы просто хотите подавить ошибки в консоли в Linux-системе, вы можете попробовать:

python yourCode.py 2>/dev/null

С помощью этого вы также можете подавить stdout:

python yourCode.py 1>/dev/null

FrankYellin Nov 12 2020 at 13:17

Одна из возможностей - перенаправить стандартный вывод и стандартную ошибку в строку. После выполнения вы можете выбрать, печатать ли результаты строки или отбросить ее и повторить попытку.

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()