【问题标题】:Python prints messages not sequentiallyPython不按顺序打印消息
【发布时间】:2020-07-29 19:59:42
【问题描述】:

如果我有这个代码

def soft_assert(condition):
    if not condition:
        print('start')
        traceback.print_stack()
        print('finish')

soft_assert(False)
soft_assert(False)

每次运行时输出都不一样:

  File "/Users/spleshakov/Documents/api-testing-with-pytest/tenants/test_uc.py", line 38, in <module>
    soft_assert(False, 'message 1')
  File "/Users/spleshakov/Documents/api-testing-with-pytest/tenants/test_uc.py", line 30, in soft_assert
    traceback.print_stack()
  File "/Users/spleshakov/Documents/api-testing-with-pytest/tenants/test_uc.py", line 41, in <module>
    soft_assert(False, 'message 4')
  File "/Users/spleshakov/Documents/api-testing-with-pytest/tenants/test_uc.py", line 30, in soft_assert
    traceback.print_stack()
start
finish
start
finish

start
finish
start
finish
  File "/Users/spleshakov/Documents/api-testing-with-pytest/tenants/test_uc.py", line 38, in <module>
    soft_assert(False)
  File "/Users/spleshakov/Documents/api-testing-with-pytest/tenants/test_uc.py", line 30, in soft_assert
    traceback.print_stack()
  File "/Users/spleshakov/Documents/api-testing-with-pytest/tenants/test_uc.py", line 41, in <module>
    soft_assert(False)
  File "/Users/spleshakov/Documents/api-testing-with-pytest/tenants/test_uc.py", line 30, in soft_assert
    traceback.print_stack()

输出可以是你能想到的任何顺序

这对我来说没有意义,我找不到答案,所以我希望社区可以帮助我解决这些问题:

  1. 为什么会这样?
  2. 如何让print 等待完成,然后再执行另一个?

谢谢

【问题讨论】:

  • 这是 javascirpt Promise 的某种类似物吗?
  • 我无法在 3.7.6 上重新创建此行为。按预期工作。

标签: python python-3.x stdout python-3.7 stderr


【解决方案1】:

问题是它默认打印到stderr,而不是stdout

# Used by print_stack
def print_list(extracted_list, file=None):
    if file is None:  # Note here
        file = sys.stderr
    for item in StackSummary.from_list(extracted_list).format():
        print(item, file=file, end="")

由于两个流同时打印到同一个控制台,因此您得到了无序输出。

指定file 参数,以便将其全部打印到同一个流中:

from sys import stdout

def soft_assert(condition):
    if not condition:
        print('start')
        traceback.print_stack(file=stdout)  # Print to stdout
        print('finish')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多