【问题标题】:Print newline if error occurs in python如果python中发生错误,则打印换行符
【发布时间】:2014-10-28 10:37:49
【问题描述】:

我有一些相对较大的程序,我曾经以每个函数只打印一行输出的方式将其进度打印到控制台(它在函数运行时显示“正在做某事......”(有时它显示百分比条)并在函数成功完成时变为“正在做某事...完成”。我应用'\r'、行清除等以使我的进度条看起来不错。但是,当发生错误时,消息会继续同一行,我想避免。例如我有一个代码:

import os, sys, subprocess
def some_function(filename):
    print('Doing something... ', end = '')
    sys.stdout.flush()
    with open(os.devnull, 'wb') as devnull:
        check = subprocess.call(['ls', filename], stdout = devnull)
        if check != 0:
            sys.exit(1)
    print('Done')
some_function('some.file')

它产生以下输出(取决于是否存在错误):

Doing something... Done

Doing something... ls: some.file: No such file or directory

以及我想在出错的情况下看到什么:

Doing something... 
ls: some.file: No such file or directory

如果发生错误(也可能是一些内部或用户定义的异常),是否有一些通用的方法可以在输出中引入换行符?

【问题讨论】:

    标签: python python-3.x stdout


    【解决方案1】:

    call 不会引发异常,因此您可以使用 stderr 捕获子进程的错误:

    import os, sys, subprocess
    def some_function(filename):
        print('Doing something... ', end='')
        sys.stdout.flush()
        with open(os.devnull, 'wb') as devnull:
            check = subprocess.Popen(['ls', filename], stdout = devnull, stderr=subprocess.PIPE)
            stdout, stderr = check.communicate()
            if stderr:
                print("\n{}".format(stderr.decode("utf-8")))
                sys.exit(1)
        print('Done')
    

    【讨论】:

      【解决方案2】:
      try:
          do stuff that might cause an error
      except:
          print()
          raise
      

      如果在 try 块内引发错误,这将打印一个新行,然后重新引发捕获的异常。

      编辑

      正如 cmets 中所指出的,在这种情况下,错误消息不是由引发的异常生成的,所以我听从 Padraic 的回答。

      【讨论】:

      • 调用不会引发异常
      • @khelwood 问题是子进程在stderr上输出消息,所以什么都抓不到。
      • 然后@PadraicCunningham 的答案获胜。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2023-02-23
      • 1970-01-01
      • 2021-07-09
      • 2020-12-24
      相关资源
      最近更新 更多