如何使用脚本将stdout重定向到文件和控制台?

14 浏览
0 Comments

如何使用脚本将stdout重定向到文件和控制台?

我想运行一个Python脚本,并将输出捕获到一个文本文件中,同时也想在控制台上显示。

我希望将其指定为Python脚本本身的属性,而不是每次在命令提示符上使用命令echo "hello world" | tee test.txt

在脚本中,我尝试过:

sys.stdout = open('log.txt','w')

但这不会在屏幕上显示stdout的输出。

我听说过logging模块,但我没有运气使用该模块完成这个任务。

0
0 Comments

问题的原因是想要在脚本中同时将输出重定向到文件和控制台,以便可以在调试时查看日志。解决方法是使用logging模块来实现这一目的。以下是实现的代码:

import logging
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(levelname)s - %(message)s',
                    filename='logs_file',
                    filemode='w')
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
logging.info('Jackdaws love my big sphinx of quartz.')
logging.info('Hello world')

以上代码首先通过调用`basicConfig`函数来设置日志级别、格式、文件名和文件模式,从而将日志记录到文件中。然后创建一个新的`StreamHandler`对象,设置日志级别并指定格式。接下来将格式应用到`StreamHandler`对象上,并将其添加到根日志记录器中。这样,日志信息就会同时输出到文件和控制台。

参考来源:[https://docs.python.org/2/howto/logging-cookbook.html](https://docs.python.org/2/howto/logging-cookbook.html)

0
0 Comments

如何在脚本中将stdout重定向到文件和控制台?

问题的原因是,有时候我们希望将Python脚本中的输出同时打印到控制台和文件中。解决方法有两个:

1. 使用shell重定向,在执行Python文件时使用以下命令:

python foo_bar.py > file

。这将把Python源代码中打印到stdout的所有结果写入文件中。

2. 如果你希望在脚本内部进行日志记录,可以使用以下代码:

import sys
class Logger(object):
    def __init__(self):
        self.terminal = sys.stdout
        self.log = open("logfile.log", "a")
    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)  
    def flush(self):
        pass    
sys.stdout = Logger()

现在你可以使用

print "Hello"

语句,这将把"Hello"同时写入stdout和日志文件中。

某些情况下了不希望手动输入> file命令的问题。对此有两个建议:可以使用命令行或者在代码中使用上述Logger类。这个类会将输出发送到控制台和文件中,无需在命令行中指定任何特殊参数。

还有人问如何恢复到正常的sys.stdout行为。可以在Logger中保存先前的sys.stdout,并创建一个函数将其恢复到原始状态。

还某些情况下了如何同时将stdout和stderr写入两个不同的文件。可以在sys.stdout = Logger()之后添加sys.stderr = sys.stdout来实现Python错误日志记录。

最后有人问如何将一个Python脚本中的print语句输出到日志文件中。可以在脚本中使用os.system("python test.py")命令,然后将test.py中的print语句输出到logfile.log文件中。

0
0 Comments

问题出现的原因是无法将输出同时重定向到文件和控制台,解决方法是创建一个Unbuffered类,将stdout的输出同时写入文件和控制台,并在文件末尾添加te.flush()来强制刷新缓冲区并写入数据,同时添加te.close()来关闭文件,以防止应用程序无法删除数据。另外,在Jupyter中,为了解决单元格无限运行的问题,需要在脚本末尾将sys.stdout重新赋值为原始的stdout。

以下是解决问题的代码:

te = open('log.txt','w')  # File where you need to keep the logs
class Unbuffered:
   def __init__(self, stream):
       self.stream = stream
   def write(self, data):
       self.stream.write(data)
       self.stream.flush()
       te.write(data)    # Write the data of stdout here to a text file as well
sys.stdout=Unbuffered(sys.stdout)
# 在文件末尾添加以下代码
te.flush()
te.close()
sys.stdout = orig_stdout

关于te.flush()的工作原理,它会在缓冲区满或者程序结束时将数据刷新到文件中,具体取决于缓冲区的大小。更多关于缓冲区刷新的信息可以参考这里:stackoverflow.com/questions/3167494/...

0