Como suprimir stdout e stderr até o sucesso em python? [duplicado]
Quero repetir o bloco de códigos até a saída bem-sucedida, mas quero exibir apenas as mensagens de sucesso.
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
Mas não sei como suprimir essas saídas abaixo. (corrida malsucedida) Eles não são o resultado que eu desejo. O bloco de código acabou sendo executado com êxito após menos de 5 tentativas e depois saiu.
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
Por favor ajude!
Respostas
Em vez de usar subprocess.check_output, você deve usar o subprocess.runmétodo padrão e canalizar o erro padrão para / dev / null. Em vez disso, use o seguinte:
gstatus_output = subprocess.run('gstatus -a -o json ', shell=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout.decode()
Se você deseja apenas suprimir os erros no console de um sistema Linux, você pode tentar:
python yourCode.py 2>/dev/null
Com isso, você também pode suprimir o stdout:
python yourCode.py 1>/dev/null
Uma possibilidade é redirecionar a saída padrão e o erro padrão para uma string. Após a execução, você pode escolher se deseja imprimir os resultados da string ou descartá-la e tentar novamente.
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()