Трассировка путается с печатью Python | порядок печати меняется случайным образом

print и traceback путаются, хотя print должно произойти раньше, traceback напечатано выше, между и ниже.

try:
    zerrr()    
except Exception as e:
    error_json, raise_error, throw = excHandler(e, throw=False)
    # print(type(k))
    if throw:
        raise Exception(raise_error)

    error_dict = json.loads(error_json)
    print(error_dict)

try:
    typerr()    
except Exception as e:
    error_json, raise_error, throw = excHandler(e, throw=True)
    # print(type(k))
    if throw:
        # raise Exception(raise_error)
        traceback.print_exc()    
    error_dict = json.loads(error_json)
    # print(error_dict)
finally:
    # Necessary calls
    musthappen()

Вывод первого запуска:

Traceback (most recent call last):
{'1515142630.125066': {'Line': 48, 'Error_call': "'return 1/0'", 'File': 'C:/Users/ankit.chouksey/Mariott/Pys/exclog.py', 'Error': ['ZeroDivisionError: division by zero\n'], 'Function': 'zerrr'}}
  File "C:/Users/ankit.chouksey/Mariott/Pys/exclog.py", line 69, in <module>
This is always happening irrespective of exceptions
    typerr()
  File "C:/Users/ankit.chouksey/Mariott/Pys/exclog.py", line 51, in typerr
    return 1+'a'
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Первый запуск:
Словарь должен был быть напечатан до трассировки, но он печатается внутри. Точно так же утверждение «Это всегда происходит независимо от исключений» должно было печатать после трассировки, но оно печатается между ними.

Вывод второго запуска:

Traceback (most recent call last):
{'1515143476.309911': {'Line': 48, 'Error': ['ZeroDivisionError: division by zero\n'], 'Function': 'zerrr', 'Error_call': "'return 1/0'", 'File': 'C:/Users/ankit.chouksey/Mariott/Pys/exclog.py'}}
This is always happening irrespective of exceptions
  File "C:/Users/ankit.chouksey/Mariott/Pys/exclog.py", line 69, in <module>
    typerr()
  File "C:/Users/ankit.chouksey/Mariott/Pys/exclog.py", line 51, in typerr
    return 1+'a'
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Второй запуск: оба отпечатка вместе, но внутри трассировки.


person ankitom    schedule 05.01.2018    source источник
comment
Возможный дубликат Bash: журнал stdout и stderr при сохранении порядка и происхождение   -  person tripleee    schedule 05.01.2018
comment
Это очень распространенный FAQ и никоим образом не относится к Python. Стандартный вывод и стандартная ошибка не обязательно отображаются в каком-либо конкретном порядке.   -  person tripleee    schedule 05.01.2018


Ответы (1)


Я протестировал аналогичный код на своем компьютере.
При тестировании в terminal вывод всегда нормальный и ожидаемый.
Однако при тестировании в IDE(PyCharm) вывод не соответствует тому, что вы сказали.
Итак, вы тестируете свой код в IDE?
И я думаю, что ответ может зависеть от используемой вами IDE. (IDE может отправлять сообщения в stdout в многопоточность/многопроцессорность?(НЕ УВЕРЕН))

person Xiaowei Liu    schedule 05.01.2018
comment
да, я использую PyCharm. Возможно, это из-за методов многопоточности PyCharm. - person ankitom; 05.01.2018